ECMA-262
6th Edition / Draft November 22, 2012
ECMAScript Language Specification
Draft
Ecma/TC39/2012/0xx
Draft
Report Errors and Issues at: https://bugs.ecmascript.org
Product: Draft for 6th Edition
Component: choose an appropriate one
Version: November 22, 2012 Draft
Contents Page
Introduction vii
1 Scope 1
2 Conformance 1
3 Normative references 1
4 Overview 1
4.1 Web Scripting 2
4.2 Language Overview 2
4.2.1 Objects 3
4.2.2 The Strict Variant of ECMAScript 4
4.3 Terms and definitions 4
5 Notational Conventions 7
5.1 Syntactic and Lexical Grammars 7
5.1.1 Context-Free Grammars 7
5.1.2 The Lexical and RegExp Grammars 8
5.1.3 The Numeric String Grammar 8
5.1.4 The Syntactic Grammar 8
5.1.5 The JSON Grammar 9
5.1.6 Grammar Notation 9
5.2 Algorithm Conventions 12
5.3 Static Semantic Rules 13
6 Source Text 14
7 Lexical Conventions 15
7.1 Unicode Format-Control Characters 16
7.2 White Space 16
7.3 Line Terminators 17
7.4 Comments 17
7.5 Tokens 18
7.6 Identifier Names and Identifiers 19
7.6.1 Reserved Words 20
7.7 Punctuators 21
7.8 Literals 21
7.8.1 Null Literals 21
7.8.2 Boolean Literals 21
7.8.3 Numeric Literals 22
7.8.4 String Literals 24
7.8.5 Regular Expression Literals 27
7.8.6 Template Literal Lexical Components 28
7.9 Automatic Semicolon Insertion 30
7.9.1 Rules of Automatic Semicolon Insertion 30
7.9.2 Examples of Automatic Semicolon Insertion 31
8 Types 32
8.1 ECMAScript Language Types 32
8.1.1 The Undefined Type 32
8.1.2 The Null Type 32
8.1.3 The Boolean Type 32
8.1.4 The String Type 33
8.1.5 The Number Type 33
8.1.6 The Object Type 34
8.2 ECMAScript Specification Types 42
8.2.1 Data Blocks 42
8.2.2 The List and Record Specification Type 43
8.2.3 The Completion Record Specification Type 43
8.2.4 The Reference Specification Type 44
8.2.5 The Property Descriptor Specification Types 46
8.2.6 The Lexical Environment and Environment Record Specification Types 48
8.3 Ordinary Object Internal Methods and Internal Data Properties 48
8.3.1 [[GetInheritance]] ( ) 48
8.3.2 [[SetInheritance]] (V) 48
8.3.3 [[IsExtensible]] ( ) 49
8.3.4 [[PreventExtensions]] ( ) 49
8.3.5 [[HasOwnProperty]] (P) 49
8.3.6 [[GetOwnProperty]] (P) 49
8.3.7 [[GetP]] (P, Receiver) 49
8.3.8 [[SetP] ( P, V, Receiver) 50
8.3.9 [[Delete]] (P) 51
8.3.10 [[DefineOwnProperty]] (P, Desc) 51
8.3.11 [[Enumerate]] () 53
8.3.12 [[Keys]] ( ) 54
8.3.13 [[OwnPropertyKeys]] ( ) 54
8.3.14 [[Freeze]] ( ) 55
8.3.15 [[Seal]] ( ) 55
8.3.16 [[IsFrozen]] ( ) 55
8.3.17 [[IsSealed]] ( ) 55
8.3.18 ObjectCreate Abstract Operation 55
8.3.19 Ordinary Function Objects 55
8.4 Built-in Exotic Object Internal Methods and Data Fields 57
8.4.1 Bound Function Exotic Objects 58
8.4.2 Array Exotic Objects 59
8.4.3 String Exotic Objects 61
8.4.4 Exotic Symbol Objects 63
8.4.5 Exotic Arguments Objects 66
8.4.5 Typed Array Exotic Objects 66
8.4.6 Built-in Function Objects 66
8.5 Proxy Object Internal Methods and Internal Data Properties 66
8.5.1 [[GetInheritance]] ( ) 67
8.5.3 [[IsExtensible]] ( ) 67
8.5.4 [[PreventExtensions]] ( ) 68
8.5.5 [[HasOwnProperty]] (P) 68
8.5.6 [[GetOwnProperty]] (P) 69
8.5.7 [[GetP]] (P, Receiver) 70
8.5.8 [[SetP] ( P, V, Receiver) 70
8.5.9 [[Delete]] (P) 71
8.5.10 [[DefineOwnProperty]] (P, Desc) 71
8.5.11 [[Enumerate]] () 72
8.5.12 [[Keys]] ( ) 72
8.5.13 [[OwnPropertyKeys]] ( ) 73
8.5.14 [[Freeze]] ( ) 73
8.5.15 [[Seal]] ( ) 73
8.5.16 [[IsFrozen]] ( ) 73
8.5.17 [[IsSealed]] ( ) 73
9 Abstract Operations 73
9.1 Type Conversion and Testing 73
9.1.1 ToPrimitive 74
9.1.2 ToBoolean 75
9.1.3 ToNumber 75
9.1.4 ToInteger 78
9.1.5 ToInt32: (Signed 32 Bit Integer) 78
9.1.6 ToUint32: (Unsigned 32 Bit Integer) 79
9.1.7 ToUint16: (Unsigned 16 Bit Integer) 79
9.1.8 ToString 79
9.1.9 ToObject 81
9.1.10 ToPropertyKey 81
9.2 Testing and Comparison Operations 81
9.2.1 CheckObjectCoercible 81
9.2.2 IsCallable 82
9.2.3 The SameValue Algorithm 82
9.2.4 IsConstructor 82
9.3 Operations on Objects 82
9.3.1 Get (O, P) 82
9.3.2 Put (O, P, V, Throw) 83
9.3.3 CreateOwnDataProperty (O, P, V) 83
9.3.4 DefinePropertyOrThrow (O, P, desc) 83
9.3.5 DeletePropertyOrThrow (O, P) 83
9.3.6 HasProperty (O, P) 84
9.3.7 GetMethod (O, P) 84
9.3.8 Invoke(O,P [,args]) 84
9.3.9 MakeObjectSecure (O, immutable) 84
9.3.10 TestIfSecureObject (O, immutable) 85
9.3.11 CreateArrayFromList (elements) 86
9.3.12 OrdinaryHasInstance (C, O) 86
10 Executable Code and Execution Contexts 86
10.1 Types of Executable Code 86
10.1.1 Strict Mode Code 87
10.1.2 Non-ECMAScript Functions 87
10.2 Lexical Environments 87
10.2.1 Environment Records 88
10.2.2 Lexical Environment Operations 99
10.3 Code Realms 100
10.4 Execution Contexts 101
10.4.1 Identifier Resolution 102
10.4.2 GetThisEnvironment 103
10.4.3 This Resolution 103
10.4.4 GetGlobalObject 103
10.5 Declaration Binding Instantiation 103
10.5.1 Global Declaration Instantiation 103
10.5.2 Module Declaration Instantiation 104
10.5.3 Function Declaration Instantiation 105
10.5.4 Block Declaration Instantiation 106
10.5.5 Eval Declaration Instantiation 107
10.6 Arguments Object 107
11 Expressions 110
11.1 Primary Expressions 110
11.1.1 The this Keyword 111
11.1.2 Identifier Reference 111
11.1.3 Literals 111
11.1.4 Array Initialiser 112
11.1.5 Object Initialiser 115
11.1.6 Function Defining Expressions 118
11.1.7 Generator Comprehensions 118
11.1.8 Regular Expression Literals 118
11.1.9 Template Literals 119
11.1.10 The Grouping Operator 122
11.2 Left-Hand-Side Expressions 123
11.2.1 Property Accessors 124
11.2.2 The new Operator 125
11.2.3 Function Calls 126
11.2.4 The super Keyword 127
11.2.5 Argument Lists 128
11.2.6 Tagged Templates 129
11.3 Postfix Expressions 129
11.3.1 Postfix Increment Operator 130
11.3.2 Postfix Decrement Operator 130
11.4 Unary Operators 130
11.4.1 The delete Operator 131
11.4.2 The void Operator 132
11.4.3 The typeof Operator 132
11.4.4 Prefix Increment Operator 132
11.4.5 Prefix Decrement Operator 133
11.4.6 Unary + Operator 133
11.4.7 Unary - Operator 133
11.4.8 Bitwise NOT Operator ( ~ ) 133
11.4.9 Logical NOT Operator ( ! ) 134
11.5 Multiplicative Operators 134
11.5.1 Applying the * Operator 134
11.5.2 Applying the / Operator 135
11.5.3 Applying the % Operator 135
11.6 Additive Operators 136
11.6.1 The Addition operator ( + ) 136
11.6.2 The Subtraction Operator ( - ) 137
11.6.3 Applying the Additive Operators to Numbers 137
11.7 Bitwise Shift Operators 137
11.7.1 The Left Shift Operator ( << ) 138
11.7.2 The Signed Right Shift Operator ( >> ) 138
11.7.3 The Unsigned Right Shift Operator ( >>> ) 138
11.8 Relational Operators 139
11.8.1 Runtime Semantics 140
11.9 Equality Operators 142
11.9.1 Runtime Semantics 143
11.10 Binary Bitwise Operators 145
11.11 Binary Logical Operators 146
11.12 Conditional Operator ( ? : ) 147
11.13 Assignment Operators 148
Static Semantics 148
Runtime Semantics 149
11.13.1 Destructuring Assignment 149
11.14 Comma Operator ( , ) 153
12 Statements and Declarations 154
Static Semantics 154
Runtime Semantics 154
12.1 Block 155
12.2 Declarations and the Variable Statement 158
12.2.1 Let and Const Declarations 158
12.2.2 Variable Statement 161
12.2.4 Destructuring Binding Patterns 163
12.3 Empty Statement 168
12.4 Expression Statement 168
12.5 The if Statement 168
12.6 Iteration Statements 169
12.6.1 The do-while Statement 170
12.6.2 The while Statement 170
12.6.3 The for Statement 171
12.6.4 The for-in and for-of Statements 172
12.7 The continue Statement 176
12.8 The break Statement 176
12.9 The return Statement 177
12.10 The with Statement 177
12.11 The switch Statement 178
12.12 Labelled Statements 182
12.13 The throw Statement 183
12.14 The try Statement 183
12.15 The debugger statement 185
13 Functions and Generators 186
13.1 Function Definitions 186
13.2 Arrow Function Definitions 191
13.3 Method Definitions 194
13.4 Generator Definitions 198
13.5 Class Definitions 199
13.6 Creating Function Objects and Constructors 202
13.7 Tail Position Calls 204
14 Scripts and Modules 204
14.1 Script 204
14.1.1 Directive Prologues and the Use Strict Directive 207
14.2 Modules 207
15 Standard Built-in ECMAScript Objects 207
15.1 The Global Object 208
15.1.1 Value Properties of the Global Object 209
15.1.2 Function Properties of the Global Object 209
15.1.3 URI Handling Function Properties 212
15.1.4 Constructor Properties of the Global Object 216
15.1.5 Other Properties of the Global Object 218
15.2 Object Objects 218
15.2.1 The Object Constructor Called as a Function 218
15.2.2 The Object Constructor 218
15.2.3 Properties of the Object Constructor 218
15.2.4 Properties of the Object Prototype Object 221
15.2.5 Properties of Object Instances 223
15.3 Function Objects 223
15.3.1 The Function Constructor Called as a Function 223
15.3.2 The Function Constructor 224
15.3.3 Properties of the Function Constructor 224
15.3.4 Properties of the Function Prototype Object 225
15.3.5 Properties of Function Instances 227
15.4 Array Objects 227
15.4.1 The Array Constructor Called as a Function 228
15.4.2 The Array Constructor 228
15.4.3 Properties of the Array Constructor 229
15.4.4 Properties of the Array Prototype Object 230
15.4.5 Properties of Array Instances 249
15.4.6 Array Iterator Object Structure 249
15.5 String Objects 251
15.5.1 The String Constructor Called as a Function 251
15.5.2 The String Constructor 251
15.5.3 Properties of the String Constructor 251
15.5.4 Properties of the String Prototype Object 253
15.5.5 Properties of String Instances 265
15.6 Boolean Objects 265
15.6.1 The Boolean Constructor Called as a Function 265
15.6.2 The Boolean Constructor 265
15.6.3 Properties of the Boolean Constructor 266
15.6.4 Properties of the Boolean Prototype Object 266
15.6.5 Properties of Boolean Instances 267
15.7 Number Objects 267
15.7.1 The Number Constructor Called as a Function 267
15.7.2 The Number Constructor 267
15.7.3 Properties of the Number Constructor 267
15.7.4 Properties of the Number Prototype Object 269
15.7.5 Properties of Number Instances 273
15.8 The Math Object 273
15.8.1 Value Properties of the Math Object 274
15.8.2 Function Properties of the Math Object 275
15.9 Date Objects 282
15.9.1 Overview of Date Objects and Definitions of Abstract Operations 282
15.9.2 The Date Constructor Called as a Function 287
15.9.3 The Date Constructor 287
15.9.4 Properties of the Date Constructor 288
15.9.5 Properties of the Date Prototype Object 289
15.9.6 Properties of Date Instances 297
15.10 RegExp (Regular Expression) Objects 297
15.10.1 Patterns 298
15.10.2 Pattern Semantics 300
15.10.3 The RegExp Constructor Called as a Function 311
15.10.4 The RegExp Constructor 311
15.10.5 Properties of the RegExp Constructor 313
15.10.6 Properties of the RegExp Prototype Object 313
15.10.7 Properties of RegExp Instances 315
15.11 Error Objects 315
15.11.1 The Error Constructor Called as a Function 315
15.11.2 The Error Constructor 316
15.11.3 Properties of the Error Constructor 316
15.11.4 Properties of the Error Prototype Object 316
15.11.5 Properties of Error Instances 317
15.11.6 Native Error Types Used in This Standard 317
15.11.7 NativeError Object Structure 318
15.12 The JSON Object 319
15.12.1 The JSON Grammar 320
15.12.2 JSON.parse ( text [ , reviver ] ) 321
15.12.3 JSON.stringify ( value [ , replacer [ , space ] ] ) 322
15.13 Binary Data Objects 327
15.13.1 The BinaryData Module 327
15.13.2 The BinaryData.Type Object 327
15.13.3 The BinaryData.ArrayType Object 327
15.13.4 The BinaryData.StructType Object 327
15.13.5 ArrayBufferObjects 327
15.13.6 TypeArray Object Structures 328
15.13.7 DataView Objects 333
15.14 Map Objects 337
15.14.1 Abstract Operations For Map Objects 337
15.14.2 The Map Constructor Called as a Function 337
15.14.3 The Map Constructor 338
15.14.4 Properties of the Map Constructor 338
15.14.5 Properties of the Map Prototype Object 338
15.14.6 Properties of Map Instances 341
15.14.7 Map Iterator Object Structure 341
15.15 WeakMap Objects 343
15.15.1 Abstract Operations For WeakMap Objects 343
15.15.2 The WeakMap Constructor Called as a Function 344
15.15.3 The WeakMap Constructor 344
15.15.4 Properties of the WeakMap Constructor 344
15.15.5 Properties of the WeakMap Prototype Object 345
15.15.6 Properties of WeakMap Instances 346
15.16 Set Objects 346
15.16.1 Abstract Operations For Set Objects 346
15.16.2 The Set Constructor Called as a Function 347
15.16.3 The Set Constructor 347
15.16.4 Properties of the Set Constructor 348
15.16.5 Properties of the Set Prototype Object 348
15.16.6 Properties of Set Instances 350
15.16.7 Set Iterator Object Structure 350
15.17 The Reflect Module 351
15.17.1 Exported Function Properties Reflecting the Essentional Internal Methods 351
15.17.2 Exported Function Properties Derived from the Essentional Internal Methods 354
15.18 Proxy Objects 355
16 Errors 355
Annex A (informative) Grammar Summary 357
A.1 Lexical Grammar 357
A.2 Number Conversions 363
A.3 Expressions 364
A.4 Statements 368
A.5 Functions and Scripts 370
A.6 Universal Resource Identifier Character Classes 371
A.7 Regular Expressions 371
A.8 JSON 373
A.8.1 JSON Lexical Grammar 373
A.8.2 JSON Syntactic Grammar 374
Annex B (normative) Additional ECMAScript Features for Web Browsers 377
B.1 Additional Syntax 377
B.1.1 Numeric Literals 377
B.1.2 String Literals 377
B.2 Additional Properties 378
B.2.1 Additional Properties of the Global Object 378
B.2.2 Additional Properties of the String.prototype Object 379
B.2.3 Additional Properties of the Date.prototype Object 382
B.3 Other Additional Features 383
B.3.1 The __proto__ pseudo property. 383
Annex C (informative) The Strict Mode of ECMAScript 385
Annex D (informative) Corrections and Clarifications with Possible Compatibility Impact 387
In Edition 6 387
In 5.1 Edition 5.1 387
In 5th Edition 5 388
Annex E (informative) Additions and Changes that Introduce Incompatibilities with Prior Editions 391
In the 6th Edition 391
In the 5th Edition 391
Annex F (informative) Static Semantic Rule Cross Reference 395
Scrap Heap 397
8.3.10 [[Enumerate]] (includePrototype, onlyEnumerable ) 398
10.5.3 Function Declaration Instantiation 399
Introduction
This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0.
The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.
That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.
The third edition of the Standard introduced powerful regular expressions, better string handling, new control statements, try/catch exception handling, tighter definition of errors, formatting for numeric output and minor changes in anticipation of forthcoming internationalisation facilities and future language growth. The third edition of the ECMAScript standard was adopted by the Ecma General Assembly of December 1999 and published as ISO/IEC 16262:2002 in June 2002.
Since publication of the third edition, ECMAScript has achieved massive adoption in conjunction with the World Wide Web where it has become the programming language that is supported by essentially all web browsers. Significant work was done to develop a fourth edition of ECMAScript. Although that work was not completed and not published as the fourth edition of ECMAScript, it informs continuing evolution of the language. The fifth edition of ECMAScript (published as ECMA-262 5th edition) codifies de facto interpretations of the language specification that have become common among browser implementations and adds support for new features that have emerged since the publication of the third edition. Such features include accessor properties, reflective creation and inspection of objects, program control of property attributes, additional array manipulation functions, support for the JSON object encoding format, and a strict mode that provides enhanced error checking and program security.
The edition 5.1 of the ECMAScript Standard has been fully aligned with the third edition of the international standard ISO/IEC 16262:2011.
This present sixth edition of the Standard………
ECMAScript is a vibrant language and the evolution of the language is not complete. Significant technical enhancement will continue with future editions of this specification.
This Ecma Standard has been adopted by the General Assembly of <month> <year>.
"DISCLAIMER
This draft document may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as needed for the purpose of developing any document or deliverable produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
ECMAScript Language Specification
Scope
This Standard defines the ECMAScript scripting language.
Conformance
A conforming implementation of ECMAScript must provide and support all the types, values, objects, properties, functions, and program syntax and semantics described in this specification.
A conforming implementation of this Standard shall interpret characters in conformance with the Unicode Standard, Version 5.1.0 or later and ISO/IEC 10646. If the adopted ISO/IEC 10646-1 subset is not otherwise specified, it is presumed to be the Unicode set, collection 10646.
A conforming implementation of ECMAScript is permitted to provide additional types, values, objects, properties, and functions beyond those described in this specification. In particular, a conforming implementation of ECMAScript is permitted to provide properties not described in this specification, and values for those properties, for objects that are described in this specification.
A conforming implementation of ECMAScript is permitted to support program and regular expression syntax not described in this specification. In particular, a conforming implementation of ECMAScript is permitted to support program syntax that makes use of the “future reserved words” listed in 7.6.1.2 of this specification.
Normative references
The following referenced documents are indispensable for the application of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.
ISO/IEC 9899:1996, Programming Languages – C, including amendment 1 and technical corrigenda 1 and 2
ISO/IEC 10646:2003: Information Technology – Universal Multiple-Octet Coded Character Set (UCS) plus Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, and Amendment 4:2008, plus additional amendments and corrigenda, or successor
The Unicode Standard, Version 5.0, as amended by Unicode 5.1.0, or successor
Unicode Standard Annex #15, Unicode Normalization Forms, version Unicode 5.1.0, or successor
Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax, version Unicode 5.1.0, or successor.
4 Overview
This section contains a non-normative overview of the ECMAScript language.
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment. ECMAScript as defined here is not intended to be computationally self-sufficient; indeed, there are no provisions in this specification for input of external data or output of computed results. Instead, it is expected that the computational environment of an ECMAScript program will provide not only the objects and other facilities described in this specification but also certain environment-specific objects, whose description and behaviour are beyond the scope of this specification except to indicate that they may provide certain properties that can be accessed and certain functions that can be called from an ECMAScript program.
A scripting language is a programming language that is used to manipulate, customise, and automate the facilities of an existing system. In such systems, useful functionality is already available through a user interface, and the scripting language is a mechanism for exposing that functionality to program control. In this way, the existing system is said to provide a host environment of objects and facilities, which completes the capabilities of the scripting language. A scripting language is intended for use by both professional and non-professional programmers. ECMAScript was originally designed to be used as a scripting language, but has become widely used as a general purpose programming language.
ECMAScript was originally designed to be a Web scripting language, providing a mechanism to enliven Web pages in browsers and to perform server computation as part of a Web-based client-server architecture. ECMAScript is now used both as a general propose programming language and to provide core scripting capabilities for a variety of host environments. Therefore the core language is specified in this document apart from any particular host environment.
Some of the facilities of ECMAScript are similar to those used in other programming languages; in particular Java™, Self, and Scheme as described in:
Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227–241, Orlando, FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
4.1 Web Scripting
A web browser provides an ECMAScript host environment for client-side computation including, for instance, objects that represent windows, menus, pop-ups, dialog boxes, text areas, anchors, frames, history, cookies, and input/output. Further, the host environment provides a means to attach scripting code to events such as change of focus, page and image loading, unloading, error and abort, selection, form submission, and mouse actions. Scripting code appears within the HTML and the displayed page is a combination of user interface elements and fixed and computed text and images. The scripting code is reactive to user interaction and there is no need for a main program.
A web server provides a different host environment for server-side computation including objects representing requests, clients, and files; and mechanisms to lock and share data. By using browser-side and server-side scripting together, it is possible to distribute computation between the client and server while providing a customised user interface for a Web-based application.
Each Web browser and server that supports ECMAScript supplies its own host environment, completing the ECMAScript execution environment.
4.2 Language Overview
The following is an informal overview of ECMAScript—not all parts of the language are described. This overview is not part of the standard proper.
ECMAScript is object-based: basic language and host facilities are provided by objects, and an ECMAScript program is a cluster of communicating objects. An ECMAScript object is a collection of properties each with zero or more attributes that determine how each property can be used—for example, when the Writable attribute for a property is set to false, any attempt by executed ECMAScript code to change the value of the property fails. Properties are containers that hold other objects, primitive values, or functions. A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String; an object is a member of the remaining built-in type Object; and a function is a callable object. A function that is associated with an object via a property is a method.
ECMAScript defines a collection of built-in objects that round out the definition of ECMAScript entities. These built-in objects include the global object, the Object object, the Function object, the Array object, the String object, the Boolean object, the Number object, the Math object, the Date object, the RegExp object, the JSON object, and the Error objects Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError and URIError.
ECMAScript also defines a set of built-in operators. ECMAScript operators include various unary operations, multiplicative operators, additive operators, bitwise shift operators, relational operators, equality operators, binary bitwise operators, binary logical operators, assignment operators, and the comma operator.
ECMAScript syntax intentionally resembles Java syntax. ECMAScript syntax is relaxed to enable it to serve as an easy-to-use scripting language. For example, a variable is not required to have its type declared nor are types associated with properties, and defined functions are not required to have their declarations appear textually before calls to them.
4.2.1 Objects
ECMAScript does not use classes such as those in C++, Smalltalk, or Java. Instead objects may be created in various ways including via a literal notation or via constructors which create objects and then execute code that initialises all or part of them by assigning initial values to their properties. Each constructor is a function that has a property named “prototype” that is used to implement prototype-based inheritance and shared properties. Objects are created by using constructors in new expressions; for example, new Date(2009,11) creates a new Date object. Invoking a constructor without using new has consequences that depend on the constructor. For example, Date() produces a string representation of the current date and time rather than an object.
Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain. When a reference is made to a property in an object, that reference is to the property of that name in the first object in the prototype chain that contains a property of that name. In other words, first the object mentioned directly is examined for such a property; if that object contains the named property, that is the property to which the reference refers; if that object does not contain the named property, the prototype for that object is examined next; and so on.
cf5
q1
q2
cf4
q1
q2
cf3
q1
q2
CFp
CFP1
CF
prototype
P1
P2
cf1
q1
q2
cf2
q1
q2
implicit prototype link
explicit prototype property
Figure 1 — Object/Prototype Relationships
In a class-based object-oriented language, in general, state is carried by instances, methods are carried by classes, and inheritance is only of structure and behaviour. In ECMAScript, the state and methods are carried by objects, while structure, behaviour, and state are all inherited.
All objects that do not directly contain a particular property that their prototype contains share that property and its value. Figure 1 illustrates this:
CF is a constructor (and also an object). Five objects have been created by using new expressions: cf1, cf2, cf3, cf4, and cf5. Each of these objects contains properties named q1 and q2. The dashed lines represent the implicit prototype relationship; so, for example, cf3’s prototype is CFp. The constructor, CF, has two properties itself, named P1 and P2, which are not visible to CFp, cf1, cf2, cf3, cf4, or cf5. The property named CFP1 in CFp is shared by cf1, cf2, cf3, cf4, and cf5 (but not by CF), as are any properties found in CFp’s implicit prototype chain that are not named q1, q2, or CFP1. Notice that there is no implicit prototype link between CF and CFp.
Unlike class-based object languages, properties can be added to objects dynamically by assigning values to them. That is, constructors are not required to name or assign values to all or any of the constructed object’s properties. In the above diagram, one could add a new shared property for cf1, cf2, cf3, cf4, and cf5 by assigning a new value to the property in CFp.
4.2.2 The Strict Variant of ECMAScript
The ECMAScript Language recognises the possibility that some users of the language may wish to restrict their usage of some features available in the language. They might do so in the interests of security, to avoid what they consider to be error-prone features, to get enhanced error checking, or for other reasons of their choosing. In support of this possibility, ECMAScript defines a strict variant of the language. The strict variant of the language excludes some specific syntactic and semantic features of the regular ECMAScript language and modifies the detailed semantics of some features. The strict variant also specifies additional error conditions that must be reported by throwing error exceptions in situations that are not specified as errors by the non-strict form of the language.
The strict variant of ECMAScript is commonly referred to as the strict mode of the language. Strict mode selection and use of the strict mode syntax and semantics of ECMAScript is explicitly made at the level of individual ECMAScript code units. Because strict mode is selected at the level of a syntactic code unit, strict mode only imposes restrictions that have local effect within such a code unit. Strict mode does not restrict or modify any aspect of the ECMAScript semantics that must operate consistently across multiple code units. A complete ECMAScript program may be composed for both strict mode and non-strict mode ECMAScript code units. In this case, strict mode only applies when actually executing code that is defined within a strict mode code unit.
In order to conform to this specification, an ECMAScript implementation must implement both the full unrestricted ECMAScript language and the strict mode variant of the ECMAScript language as defined by this specification. In addition, an implementation must support the combination of unrestricted and strict mode code units into a single composite program.
4.3 Terms and definitions
For the purposes of this document, the following terms and definitions apply.
4.3.1
type
set of data values as defined in Clause 8 of this specification
4.3.2
primitive value
member of one of the types Undefined, Null, Boolean, Number, or String as defined in Clause 8
NOTE A primitive value is a datum that is represented directly at the lowest level of the language implementation.
4.3.3
object
member of the type Object
NOTE An object is a collection of properties and has a single prototype object. The prototype may be the null value.
4.3.4
constructor
function object that creates and initialises objects
NOTE The value of a constructor’s “prototype” property is a prototype object that is used to implement inheritance and shared properties.
4.3.5
prototype
object that provides shared properties for other objects
NOTE When a constructor creates an object, that object implicitly references the constructor’s “prototype” property for the purpose of resolving property references. The constructor’s “prototype” property can be referenced by the program expression constructor.prototype, and properties added to an object’s prototype are shared, through inheritance, by all objects sharing the prototype. Alternatively, a new object may be created with an explicitly specified prototype by using the Object.create built-in function.
4.3.6
ordinary object
object that has the default behaviour for the internal methods that must be supported by all ECMAScript objects.
4.3.7
exotic object
object that has some alternative behaviour for one or more of the internal methods that must be supported by all ECMAScript objects.
NOTE Any object that is not an ordinary object is an exotic object.
4.3.8
standard object
object whose semantics are defined by this specification.
4.3.9
built-in object
object supplied by an ECMAScript implementation, independent of the host environment, that is present at the start of the execution of an ECMAScript program
NOTE Standard built-in objects are defined in this specification, and an ECMAScript implementation may specify and define others. A built-in constructor is a built-in object that is also a constructor.
4.3.10
undefined value
primitive value used when a variable has not been assigned a value
4.3.11
Undefined type
type whose sole value is the undefined value
4.3.12
null value
primitive value that represents the intentional absence of any object value
4.3.13
Null type
type whose sole value is the null value
4.3.14
Boolean value
member of the Boolean type
NOTE There are only two Boolean values, true and false.
4.3.15
Boolean type
type consisting of the primitive values true and false
4.3.16
Boolean object
member of the Object type that is an instance of the standard built-in Boolean constructor
NOTE A Boolean object is created by using the Boolean constructor in a new expression, supplying a Boolean value as an argument. The resulting object has an internal data property whose value is the Boolean value. A Boolean object can be coerced to a Boolean value.
4.3.17
String value
primitive value that is a finite ordered sequence of zero or more 16-bit unsigned integer
NOTE A String value is a member of the String type. Each integer value in the sequence usually represents a single 16-bit unit of UTF-16 text. However, ECMAScript does not place any restrictions or requirements on the values except that they must be 16-bit unsigned integers.
4.3.18
String type
set of all possible String values
4.3.19
String object
member of the Object type that is an instance of the standard built-in String constructor
NOTE A String object is created by using the String constructor in a new expression, supplying a String value as an argument. The resulting object has an internal data property whose value is the String value. A String object can be coerced to a String value by calling the String constructor as a function (15.5.1).
4.3.20
Number value
primitive value corresponding to a double-precision 64-bit binary format IEEE 754 value
NOTE A Number value is a member of the Number type and is a direct representation of a number.
4.3.21
Number type
set of all possible Number values including the special “Not-a-Number” (NaN) value, positive infinity, and negative infinity
4.3.22
Number object
member of the Object type that is an instance of the standard built-in Number constructor
NOTE A Number object is created by using the Number constructor in a new expression, supplying a Number value as an argument. The resulting object has an internal data property whose value is the Number value. A Number object can be coerced to a Number value by calling the Number constructor as a function (15.7.1).
4.3.23
Infinity
number value that is the positive infinite Number value
4.3.24
NaN
number value that is a IEEE 754 “Not-a-Number” value
4.3.25
function
member of the Object type that may be invoked as a subroutine
NOTE In addition to its named properties, a function contains executable code and state that determine how it behaves when invoked. A function’s code may or may not be written in ECMAScript.
4.3.26
built-in function
built-in object that is a function
NOTE Examples of built-in functions include parseInt and Math.exp. An implementation may provide implementation-dependent built-in functions that are not described in this specification.
4.3.27
property
association between a name and a value that is a part of an object
NOTE Depending upon the form of the property the value may be represented either directly as a data value (a primitive value, an object, or a function object) or indirectly by a pair of accessor functions.
4.3.28
method
function that is the value of a property
NOTE When a function is called as a method of an object, the object is passed to the function as its this value.
4.3.29
built-in method
method that is a built-in function
NOTE Standard built-in methods are defined in this specification, and an ECMAScript implementation may specify and provide other additional built-in methods.
4.3.30
attribute
internal value that defines some characteristic of a property
4.3.31
own property
property that is directly contained by its object
4.3.32
inherited property
property of an object that is not an own property but is a property (either own or inherited) of the object’s prototype
5 Notational Conventions
5.1 Syntactic and Lexical Grammars
5.1.1 Context-Free Grammars
A context-free grammar consists of a number of productions. Each production has an abstract symbol called a nonterminal as its left-hand side, and a sequence of zero or more nonterminal and terminal symbols as its right-hand side. For each grammar, the terminal symbols are drawn from a specified alphabet.
A chain production is a production that has exactly one nonterminal symbol on its right-hand side along with zero or more terminal symbols.
Starting from a sentence consisting of a single distinguished nonterminal, called the goal symbol, a given context-free grammar specifies a language, namely, the (perhaps infinite) set of possible sequences of terminal symbols that can result from repeatedly replacing any nonterminal in the sequence with a right-hand side of a production for which the nonterminal is the left-hand side.
5.1.2 The Lexical and RegExp Grammars
A lexical grammar for ECMAScript is given in clause 7. This grammar has as its terminal symbols characters (Unicode code units) that conform to the rules for SourceCharacter defined in Clause 6. It defines a set of productions, starting from the goal symbol InputElementDiv or InputElementRegExp, that describe how sequences of such characters are translated into a sequence of input elements.
Input elements other than white space and comments form the terminal symbols for the syntactic grammar for ECMAScript and are called ECMAScript tokens. These tokens are the reserved words, identifiers, literals, and punctuators of the ECMAScript language. Moreover, line terminators, although not considered to be tokens, also become part of the stream of input elements and guide the process of automatic semicolon insertion (7.9). Simple white space and single-line comments are discarded and do not appear in the stream of input elements for the syntactic grammar. A MultiLineComment (that is, a comment of the form “/*…*/” regardless of whether it spans more than one line) is likewise simply discarded if it contains no line terminator; but if a MultiLineComment contains one or more line terminators, then it is replaced by a single line terminator, which becomes part of the stream of input elements for the syntactic grammar.
A RegExp grammar for ECMAScript is given in 15.10. This grammar also has as its terminal symbols the characters as defined by SourceCharacter. It defines a set of productions, starting from the goal symbol Pattern, that describe how sequences of characters are translated into regular expression patterns.
Productions of the lexical and RegExp grammars are distinguished by having two colons “::” as separating punctuation. The lexical and RegExp grammars share some productions.
5.1.3 The Numeric String Grammar
Another grammar is used for translating Strings into numeric values. This grammar is similar to the part of the lexical grammar having to do with numeric literals and has as its terminal symbols SourceCharacter. This grammar appears in 9.3.1.
Productions of the numeric string grammar are distinguished by having three colons “:::” as punctuation.
5.1.4 The Syntactic Grammar
The syntactic grammar for ECMAScript is given in clauses 11, 12, 13 and 14. This grammar has ECMAScript tokens defined by the lexical grammar as its terminal symbols (5.1.2). It defines a set of productions, starting from the goal symbol Script, that describe how sequences of tokens can form syntactically correct independent components of an ECMAScript programs.
When a stream of characters is to be parsed as an ECMAScript script, it is first converted to a stream of input elements by repeated application of the lexical grammar; this stream of input elements is then parsed by a single application of the syntactic grammar. The script is syntactically in error if the tokens in the stream of input elements cannot be parsed as a single instance of the goal nonterminal Script, with no tokens left over.
Productions of the syntactic grammar are distinguished by having just one colon “:” as punctuation.
The syntactic grammar as presented in clauses 11, 12, 13 and 14 is actually not a complete account of which token sequences are accepted as correct ECMAScript scripts. Certain additional token sequences are also accepted, namely, those that would be described by the grammar if only semicolons were added to the sequence in certain places (such as before line terminator characters). Furthermore, certain token sequences that are described by the grammar are not considered acceptable if a terminator character appears in certain “awkward” places.
In certain cases in order to avoid ambiguities the syntactic grammar uses generalize productions that permit token sequences that are not valid ECMAScript scriptss. For example, this technique is used in with object literals and object destructuring patterns. In such cases a more restrictive supplemental grammar is provided that further restricts the acceptable token sequences. In certain contexts, when explicitly specific, the input elements corresponding to such a production are parsed again using a goal symbol of a supplemental grammar. The script is syntactically in error if the tokens in the stream of input elements cannot be parsed as a single instance of the supplemental goal symbol, with no tokens left over.
5.1.5 The JSON Grammar
The JSON grammar is used to translate a String describing a set of ECMAScript objects into actual objects. The JSON grammar is given in 15.12.1.
The JSON grammar consists of the JSON lexical grammar and the JSON syntactic grammar. The JSON lexical grammar is used to translate character sequences into tokens and is similar to parts of the ECMAScript lexical grammar. The JSON syntactic grammar describes how sequences of tokens from the JSON lexical grammar can form syntactically correct JSON object descriptions.
Productions of the JSON lexical grammar are distinguished by having two colons “::” as separating punctuation. The JSON lexical grammar uses some productions from the ECMAScript lexical grammar. The JSON syntactic grammar is similar to parts of the ECMAScript syntactic grammar. Productions of the JSON syntactic grammar are distinguished by using one colon “:” as separating punctuation.
5.1.6 Grammar Notation
Terminal symbols of the lexical, RegExp, and numeric string grammars, and some of the terminal symbols of the other grammars, are shown in fixed width font, both in the productions of the grammars and throughout this specification whenever the text directly refers to such a terminal symbol. These are to appear in a script exactly as written. All terminal symbol characters specified in this way are to be understood as the appropriate Unicode character from the ASCII range, as opposed to any similar-looking characters from other Unicode ranges.
Nonterminal symbols are shown in italic type. The definition of a nonterminal (also called a “production”) is introduced by the name of the nonterminal being defined followed by one or more colons. (The number of colons indicates to which grammar the production belongs.) One or more alternative right-hand sides for the nonterminal then follow on succeeding lines. For example, the syntactic definition:
WhileStatement :
while ( Expression ) Statement
states that the nonterminal WhileStatement represents the token while, followed by a left parenthesis token, followed by an Expression, followed by a right parenthesis token, followed by a Statement. The occurrences of Expression and Statement are themselves nonterminals. As another example, the syntactic definition:
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
states that an ArgumentList may represent either a single AssignmentExpression or an ArgumentList, followed by a comma, followed by an AssignmentExpression. This definition of ArgumentList is recursive, that is, it is defined in terms of itself. The result is that an ArgumentList may contain any positive number of arguments, separated by commas, where each argument expression is an AssignmentExpression. Such recursive definitions of nonterminals are common.
The subscripted suffix “opt”, which may appear after a terminal or nonterminal, indicates an optional symbol. The alternative containing the optional symbol actually specifies two right-hand sides, one that omits the optional element and one that includes it. This means that:
VariableDeclaration :
Identifier Initialiseropt
is a convenient abbreviation for:
VariableDeclaration :
Identifier
Identifier Initialiser
and that:
IterationStatement :
for ( ExpressionNoInopt ; Expressionopt ; Expressionopt ) Statement
is a convenient abbreviation for:
IterationStatement :
for ( ;
Expressionopt ; Expressionopt ) Statement
for (
ExpressionNoIn ; Expressionopt ; Expressionopt )
Statement
which in turn is an abbreviation for:
IterationStatement :
for ( ; ;
Expressionopt ) Statement
for ( ; Expression ; Expressionopt ) Statement
for ( ExpressionNoIn ; ; Expressionopt ) Statement
for (
ExpressionNoIn ; Expression ; Expressionopt ) Statement
which in turn is an abbreviation for:
IterationStatement :
for ( ; ; )
Statement
for ( ; ; Expression ) Statement
for ( ; Expression ; ) Statement
for ( ;
Expression ; Expression ) Statement
for ( ExpressionNoIn ; ; ) Statement
for (
ExpressionNoIn ; ; Expression ) Statement
for ( ExpressionNoIn ; Expression ; )
Statement
for ( ExpressionNoIn
; Expression ; Expression ) Statement
so the nonterminal IterationStatement actually has eight alternative right-hand sides.
When the words “one of” follow the colon(s) in a grammar definition, they signify that each of the terminal symbols on the following line or lines is an alternative definition. For example, the lexical grammar for ECMAScript contains the production:
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
which is merely a convenient abbreviation for:
NonZeroDigit ::
1
2
3
4
5
6
7
8
9
If the phrase “[empty]” appears as the right-hand side of a production, it indicates that the production's right-hand side contains no terminals or nonterminals.
If the phrase “[lookahead ∉ set]” appears in the right-hand side of a production, it indicates that the production may not be used if the immediately following input token is a member of the given set. The set can be written as a list of terminals enclosed in curly braces. For convenience, the set can also be written as a nonterminal, in which case it represents the set of all terminals to which that nonterminal could expand. For example, given the definitions
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
the definition
LookaheadExample ::
n [lookahead ∉ {1,
3, 5, 7, 9}]
DecimalDigits
DecimalDigit [lookahead ∉ DecimalDigit
]
matches either the letter n followed by one or more decimal digits the first of which is even, or a decimal digit not followed by another decimal digit.
If the phrase “[no LineTerminator here]” appears in the right-hand side of a production of the syntactic grammar, it indicates that the production is a restricted production: it may not be used if a LineTerminator occurs in the input stream at the indicated position. For example, the production:
ThrowStatement :
throw [no LineTerminator here] Expression ;
indicates that the production may not be used if a LineTerminator occurs in the script between the throw token and the Expression.
Unless the presence of a LineTerminator is forbidden by a restricted production, any number of occurrences of LineTerminator may appear between any two consecutive tokens in the stream of input elements without affecting the syntactic acceptability of the script.
The lexical grammar has multiple goal symbols and the appropriate goal symbol to use depends upon the syntactic grammar context. If a phrase of the form “[Lexical goal LexicalGoalSymbol]” appears on the right-hand-side of a syntactic production then the next token must be lexically recognized using the indicated goal symbol. In the absence of such a phrase the default lexical goal symbol is used.
When an alternative in a production of the lexical grammar or the numeric string grammar appears to be a multi-character token, it represents the sequence of characters that would make up such a token.
The right-hand side of a production may specify that certain expansions are not permitted by using the phrase “but not” and then indicating the expansions to be excluded. For example, the production:
Identifier ::
IdentifierName but not ReservedWord
means that the nonterminal Identifier may be replaced by any sequence of characters that could replace IdentifierName provided that the same sequence of characters could not replace ReservedWord.
Finally, a few nonterminal symbols are described by a descriptive phrase in sans-serif type in cases where it would be impractical to list all the alternatives:
SourceCharacter ::
any Unicode character
5.2 Algorithm Conventions
The specification often uses a numbered list to specify steps in an algorithm. These algorithms are used to precisely specify the required semantics of ECMAScript language constructs. The algorithms are not intended to imply the use of any specific implementation technique. In practice, there may be more efficient algorithms available to implement a given feature.
Algorithms may be explicitly parameterized, in which case the names and usage of the parameters must be provided as part of the algorithm’s definition. In order to facilitate their use in multiple parts of this specification, some algorithms, called abstract operations, are named and written in parameterised functional form so that they may be referenced by name from within other algorithms.
Algorithms may be associated with productions of one of the ECMAScript grammars. A production that has multiple alternative definitions will typically have a distinct algorithm for each alternative. When an algorithm is associated with a grammar production, it may reference the terminal and non-terminal symbols of the production alternative as if they were parameters of the algorithm. When used in this manner, non-terminal symbols refer to the actual alternative definition that is matched when parsing the script souce code.
Unless explicitly specified otherwise, all chain productions have an implicit associated definition for every algorithm that is might be applied to that production’s left-hand side nonterminal. The implicit simply reapplies the same algorithm name with the same parameters, if any, to the chain production’s sole right-hand side nonterminal and then result. For example, assume there is a production
Block :
{ StatementList }
but there is no evalution algorithm that is explicitly specified for that production. If in some algorithm there is a statement of the form: “Return the result of evaluating Block” it is implicit that the algorithm has an evalution algorithm of the form:
Runtime Semantics: Evaluation
Block : { StatementList }
For clarity of expression, algorithm steps may be subdivided into sequential substeps. Substeps are indented and may themselves be further divided into indented substeps. Outline numbering conventions are used to identify substeps with the first level of substeps labelled with lower case alphabetic characters and the second level of substeps labelled with lower case roman numerals. If more than three levels are required these rules repeat with the fourth level using numeric labels. For example:
A step or substep may be written as an “if” predicate that conditions its substeps. In this case, the substeps are only applied if the predicate is true. If a step or substep begins with the word “else”, it is a predicate that is the negation of the preceding “if” predicate step at the same level.
A step may specify the iterative application of its substeps.
A step may assert an invariant condition of its algorithm. Such assertions are used to make explicit algorithmic invariants that would otherwise be implicit. Such assertions add no additional semantic requirements and hence need not be checked by an implementation. They are used simply to clarify algorithms.
Mathematical operations such as addition, subtraction, negation, multiplication, division, and the mathematical functions defined later in this clause should always be understood as computing exact mathematical results on mathematical real numbers, which do not include infinities and do not include a negative zero that is distinguished from positive zero. Algorithms in this standard that model floating-point arithmetic include explicit steps, where necessary, to handle infinities and signed zero and to perform rounding. If a mathematical operation or function is applied to a floating-point number, it should be understood as being applied to the exact mathematical value represented by that floating-point number; such a floating-point number must be finite, and if it is +0 or −0 then the corresponding mathematical value is simply 0.
The mathematical function abs(x) yields the absolute value of x, which is −x if x is negative (less than zero) and otherwise is x itself.
The mathematical function sign(x) yields 1 if x is positive and −1 if x is negative. The sign function is not used in this standard for cases when x is zero.
The notation “x modulo y” (y must be finite and nonzero) computes a value k of the same sign as y (or zero) such that abs(k) < abs(y) and x−k = q × y for some integer q.
The mathematical function floor(x) yields the largest integer (closest to positive infinity) that is not larger than x.
NOTE floor(x) = x−(x modulo 1).
If an algorithm is defined to “throw an exception”, execution of the algorithm is terminated and no result is returned. The calling algorithms are also terminated, until an algorithm step is reached that explicitly deals with the exception, using terminology such as “If an exception was thrown…”. Once such an algorithm step has been encountered the exception is no longer considered to have occurred.
5.3 Static Semantic Rules
Context-free grammars are not sufficiently powerful to express all the rules that define whether a stream of input elements make up a valid ECMAScript script that may be evaluated. In some situations additional rules are needed that may be expressed using either ECMAScript algorithm conventions or prose requirements. Such rules are always associated with a production of a grammar and are called the static semantics of the production.
Static Semantic Rules have names and typically are defined using an algorithm. Named Static Semantic Rules are associated with grammar productions and a production that has multiple alternative definitions will typically have for each alternative a distinct algorithm for each applicable named static semantic rule.
Unless otherwise specified every grammar production alternative in this specification implicitly has a definition for a static semantic rule named Contains which takes an argument named symbol whose value is a terminal or non-terminal of the grammar that includes the associated production. The default definition of Contains is:
The above definition is explicitly over-ridden for specific productions.
A special kind of static semantic rule is an Early Error Rule. Early error rules define early error conditions (see clause 16) that are associate with specific grammar productions. Evaluation of most early error rules are not explicitly invoked within the algorithms of this specification. A comforming implementation must, prior to the first evaluation of a Script, validate all of the early error rules of the productions used to parse that Script. If any of the early error rules are violated the Script is invalid and can not be evaluated.
6 Source Text
Syntax
SourceCharacter ::
any Unicode character
The ECMAScript code is expressed using Unicode, version 5.1 or later. ECMAScript source text is a sequence of Unicode characters. The phrase “Unicode character” refers to the abstract linguistic or typographical unit represented by a single Unicode scalar value. The actual encodings used to store and interchange ECMAScript source text is not relevant to this specification. Any well-defined encoding such as UTF-32 or UTF-16 may be used. Source text might even be externally represented using a non-Unicode character encoding. Regardless of the external source text encoding, a conforming ECMAScript implementation processes the source text as if it was an equivalent sequence of SourceCharacter values. Each SourceCharacter being an abstract Unicode character with a corresponding Unicode scalar value. Conforming ECMAScript implementations are not required to perform any normalisation of text, or behave as though they were performing normalisation of text.
The phrase “code point” refers to such a Unicode scalar value. “Unicode character” only refers to entities represented by single Unicode scalar values: the components of a combining character sequence are still individual “Unicode characters,” even though a user might think of the whole sequence as a single character.
In string literals, regular expression literals,template literals and identifiers, any Unicode characters may also be expressed as a Unicode escape sequence that explicitly express a code point’s numeric value. Within a comment, such an escape sequence is effectively ignored as part of the comment. Within other contexts, such an escape sequence contextually contributes one Unicode character.
NOTE
ECMAScript differs from the Java programming language in the behaviour of Unicode escape sequences. In a Java program, if the Unicode escape sequence \u000A, for example, occurs within a single-line comment, it is interpreted as a line terminator (Unicode character 000A is line feed) and therefore the next Unicode character is not part of the comment. Similarly, if the Unicode escape sequence \u000A occurs within a string literal in a Java program, it is likewise interpreted as a line terminator, which is not allowed within a string literal—one must write \n instead of \u000A to cause a line feed to be part of the string value of a string literal. In an ECMAScript program, a Unicode escape sequence occurring within a comment is never interpreted and therefore cannot contribute to termination of the comment. Similarly, a Unicode escape sequence occurring within a string literal in an ECMAScript program always contributes a Unicode character to the literal and is never interpreted as a line terminator or as a quote mark that might terminate the string literal.
ECMAScript String values (8.4) are computational sequences of 16-bit integer values called “code units”. ECMAScript language constructs that generate string values from SourceCharacter sequences use UTF-16 encoding to generate the code unit values.
Static Semantics: UTF-16 Encoding
The UTF-16 Encoding of a numeric code point value, cp, is deterimined as follows:
7 Lexical Conventions
The source text of an ECMAScript script is first converted into a sequence of input elements, which are tokens, line terminators, comments, or white space. The source text is scanned from left to right, repeatedly taking the longest possible sequence of characters as the next input element.
There are several situations where the identification of lexical input elements is sensitive to the syntactic grammar context that is consuming the input elements. This requires multiple goal symbols for the lexical grammar. The InputElementDiv goal symbol is the default goal symbol and is used in those syntactic grammar contexts where a leading division (/) or division-assignment (/=) operator is permitted. The InputElementRegExp goal symbol is used in all syntactic grammar contexts where a RegularExpressionLiteral is permitted. The InputElementTemplateTail goal is used in syntactic grammar contexts where a TemplateLiteral logically continues after a substitution element.
NOTE There are no syntactic grammar contexts where both a leading division or division-assignment, and a leading RegularExpressionLiteral are permitted. This is not affected by semicolon insertion (see 7.9); in examples such as the following:
a = b
/hi/g.exec(c).map(d);
where the first non-whitespace, non-comment character after a LineTerminator is slash (/) and the syntactic context allows division or division-assignment, no semicolon is inserted at the LineTerminator. That is, the above example is interpreted in the same way as:
a = b / hi / g.exec(c).map(d);
Syntax
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
Token
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
Token
RightBracePunctuator
RegularExpressionLiteral
InputElementTemplateTail ::
WhiteSpace
LineTerminator
Comment
Token
DivPunctuator
TemplateSubstitutionTail
7.1 Unicode Format-Control Characters
The Unicode format-control characters (i.e., the characters in category “Cf” in the Unicode Character Database such as left-to-right mark or right-to-left mark) are control codes used to control the formatting of a range of text in the absence of higher-level protocols for this (such as mark-up languages).
It is useful to allow format-control characters in source text to facilitate editing and display. All format control characters may be used within comments, and within string literals, template literals, and regular expression literals.
<ZWNJ> and <ZWJ> are format-control characters that are used to make necessary distinctions when forming words or phrases in certain languages. In ECMAScript source text, <ZWNJ> and <ZWJ> may also be used in an identifier after the first character.
<BOM> is a format-control character used primarily at the start of a text to mark it as Unicode and to allow detection of the text's encoding and byte order. <BOM> characters intended for this purpose can sometimes also appear after the start of a text, for example as a result of concatenating files. <BOM> characters are treated as white space characters (see 7.2).
The special treatment of certain format-control characters outside of comments, string literals, and regular expression literals is summarised in Table 1.
Table 1 — Format-Control Character Usage
|
Code Point |
Name |
Formal Name |
Usage |
|
U+200C |
Zero width non-joiner |
<ZWNJ> |
IdentifierPart |
|
U+200D |
Zero width joiner |
<ZWJ> |
IdentifierPart |
|
U+FEFF |
Byte Order Mark |
<BOM> |
Whitespace |
7.2 White Space
White space characters are used to improve source text readability and to separate tokens (indivisible lexical units) from each other, but are otherwise insignificant. White space characters may occur between any two tokens and at the start or end of input. White space characters may occur within a StringLiteral, a RegularExpressionLiteral, a Template, or a TemplateSubstitutionTail where they are considered significant characters forming part of a literal value. They may also occur within a Comment, but cannot appear within any other kind of token.
The ECMAScript white space characters are listed in Table 2.
Table 2 — Whitespace Characters
|
Code Point |
Name |
Formal Name |
|
U+0009 |
Tab |
<TAB> |
|
U+000B |
Vertical Tab |
<VT> |
|
U+000C |
Form Feed |
<FF> |
|
U+0020 |
Space |
<SP> |
|
U+00A0 |
No-break space |
<NBSP> |
|
U+FEFF Other category “Zs” |
Byte Order Mark Any other Unicode “space separator” |
<BOM> <USP> |
ECMAScript implementations must recognise all of the white space characters defined in Unicode 5.1. Later editions of the Unicode Standard may define other white space characters. ECMAScript implementations may recognise white space characters from later editions of the Unicode Standard.
Syntax
WhiteSpace ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<BOM>
<USP>
7.3 Line Terminators
Like white space characters, line terminator characters are used to improve source text readability and to separate tokens (indivisible lexical units) from each other. However, unlike white space characters, line terminators have some influence over the behaviour of the syntactic grammar. In general, line terminators may occur between any two tokens, but there are a few places where they are forbidden by the syntactic grammar. Line terminators also affect the process of automatic semicolon insertion (7.9). A line terminator cannot occur within any token except a StringLiteral, Template, or TemplateSubstitutionTail. Line terminators may only occur within a StringLiteral token as part of a LineContinuation.
A line terminator can occur within a MultiLineComment (7.4) but cannot occur within a SingleLineComment.
Line terminators are included in the set of white space characters that are matched by the \s class in regular expressions.
The ECMAScript line terminator characters are listed in Table 3.
Table 3 — Line Terminator Characters
|
Code Point |
Name |
Formal Name |
|
U+000A |
Line Feed |
<LF> |
|
U+000D |
Carriage Return |
<CR> |
|
U+2028 |
Line separator |
<LS> |
|
U+2029 |
Paragraph separator |
<PS> |
Only the Unicode characters in Table 3 are treated as line terminators. Other new line or line breaking Unicode characters are treated as white space but not as line terminators. The sequence <CR><LF> is commonly used as a line terminator. It should be considered a single SourceCharacter for the purpose of reporting line numbers.
Syntax
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>
[lookahead ∉ <LF> ]
<LS>
<PS>
<CR>
<LF>
7.4 Comments
Comments can be either single or multi-line. Multi-line comments cannot nest.
Because a single-line comment can contain any Unicode character except a LineTerminator character, and because of the general rule that a token is always as long as possible, a single-line comment always consists of all characters from the // marker to the end of the line. However, the LineTerminator at the end of the line is not considered to be part of the single-line comment; it is recognised separately by the lexical grammar and becomes part of the stream of input elements for the syntactic grammar. This point is very important, because it implies that the presence or absence of single-line comments does not affect the process of automatic semicolon insertion (see 7.9).
Comments behave like white space and are discarded except that, if a MultiLineComment contains a line terminator character, then the entire comment is considered to be a LineTerminator for purposes of parsing by the syntactic grammar.
Syntax
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
7.5 Tokens
Syntax
Token ::
IdentifierName
Punctuator
NumericLiteral
StringLiteral
Template
NOTE The DivPunctuator, RegularExpressionLiteral, RightBracePunctuator, and TemplateSubstitutionTail productions define tokens, but are not included in the Token production.
7.6 Identifier Names and Identifiers
IdentifierName, Identifier, and ReservedWord are tokens that are interpreted according to the Default Identifier Syntax given in Unicode Standard Annex #31, Identifier and Pattern Syntax, with some small modifications. ReservedWord is is an enumerated subset of IdentifierName and Identifier is an IdentifierName that is not a ReservedWord (see 7.6.1). The Unicode identifier grammar is based on character properties specified by the Unicode Standard. The Unicode characters in the specified categories in version 5.1.0 of the Unicode standard must be treated as in those categories by all conforming ECMAScript implementations. ECMAScript implementations may recognise identifier characters defined in later editions of the Unicode Standard.
NOTE 1 This standard specifies specific character additions: The dollar sign (U+0024) and the underscore (U+005f) are permitted anywhere in an IdentifierName, and the characters zero width non-joiner (U+200C) and zero width joiner (U+200D) are permitted anywhere after the first character of an IdentifierName.
Unicode escape sequences are permitted in an IdentifierName, where they contribute a single Unicode character to the IdentifierName. The code point of the contributed character is expressed by the HexDigits of the UnicodeEscapeSequence (see 7.8.4). The \ preceding the UnicodeEscapeSequence and the u and { } characters, if they appear, do not contribute characters to the IdentifierName. A UnicodeEscapeSequence cannot be used to put a character into an IdentifierName that would otherwise be illegal. In other words, if a \ UnicodeEscapeSequence sequence were replaced by the Unicode character it constributes, the result must still be a valid IdentifierName that has the exact same sequence of characters as the original IdentifierName. All interpretations of IdentifierName within this specification are based upon their actual characters regardless of whether or not an escape sequence was used to contribute any particular characters.
Two IdentifierName that are canonically equivalent according to the Unicode standard are not equal unless they are represented by the exact same sequence of code units (in other words, conforming ECMAScript implementations are only required to do bitwise comparison on IdentifierName values).
NOTE 2 If maximal portability is a concern, programmers should only employ the identifier characters that were defined in Unicode 3.0.
Syntax
Identifier ::
IdentifierName but not ReservedWord
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeIDStart
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
UnicodeIDContinue
$
_
\ UnicodeEscapeSequence
<ZWNJ>
<ZWJ>
UnicodeIDStart ::
any Unicode character with the Unicode property “ID_Start”.
UnicodeIDContinue ::
any Unicode character with the Unicode property “ID_Continue”
The definitions of the nonterminal UnicodeEscapeSequence is given in 7.8.4
Static Semantics: StringValue
Identifier :: IdentifierName but not ReservedWord
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
7.6.1 Reserved Words
A reserved word is an IdentifierName that cannot be used as an Identifier.
Syntax
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
The ReservedWord definitions are specified as literal sequences of Unicode characters. However, any Unicode character in a ReservedWord can also be expressed by a \ UnicodeEscapeSequence that expresses that same Unicode character’s code point. Use of such escape sequences does not change the meaning of the ReservedWord.
7.6.1.1 Keywords
The following tokens are ECMAScript keywords and may not be used as Identifiers in ECMAScript programs.
Syntax
Keyword :: one of
|
break |
delete |
import |
this |
|
case |
do |
in |
throw |
|
catch |
else |
instanceof |
try |
|
class |
export |
let |
typeof |
|
continue |
finally |
new |
var |
|
const |
for |
return |
void |
|
debugger |
function |
super |
while |
|
default |
if |
switch |
with |
7.6.1.2 Future Reserved Words
The following words are used as keywords in proposed extensions and are therefore reserved to allow for the possibility of future adoption of those extensions.
Syntax
FutureReservedWord :: one of
|
enum |
extends |
||
The following tokens are also considered to be FutureReservedWords when they occur within strict mode code (see 10.1.1). The occurrence of any of these tokens within strict mode code in any context where the occurrence of a FutureReservedWord would produce an error must also produce an equivalent error:
|
implements |
private |
public |
yield |
|
|
interface |
package |
protected |
static |
7.7 Punctuators
Syntax
Punctuator :: one of
|
{ |
( |
) |
[ |
] |
|
|
. |
; |
, |
< |
> |
<= |
|
>= |
== |
!= |
=== |
!== |
|
|
+ |
- |
* |
% |
++ |
-- |
|
<< |
>> |
>>> |
& |
| |
^ |
|
! |
~ |
&& |
|| |
? |
: |
|
= |
+= |
-= |
*= |
%= |
<<= |
|
>>= |
>>>= |
&= |
|= |
^= |
=> |
DivPunctuator :: one of
|
/ |
/= |
RightBracePunctuator ::
|
} |
7.8 Literals
7.8.1 Null Literals
Syntax
NullLiteral ::
null
7.8.2 Boolean Literals
Syntax
BooleanLiteral ::
true
false
7.8.3 Numeric Literals
Syntax
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt
ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral
ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit
DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
+ DecimalDigits
-
DecimalDigits
BinaryIntegerLiteral ::
0b
BinaryDigit
0B
BinaryDigit
BinaryIntegerLiteral BinaryDigit
BinaryDigit :: one of
0 1
OctalIntegerLiteral ::
0o
OctalDigit
0O
OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
HexIntegerLiteral ::
0x
HexDigits
0X HexDigits
HexDigits ::
HexDigit
HexDigits HexDigit
HexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
The SourceCharacter immediately following a NumericLiteral must not be an IdentifierStart or DecimalDigit.
NOTE For example:
3in
is an error and not the two input elements 3 and in.
A conforming implementation, when processing strict mode code (see 10.1.1), must not extend the syntax of NumericLiteral to include OctalIntegerLiteral as described in B.1.1.
Static Semantics: MV’s
A numeric literal stands for a value of the Number type. This value is determined in two steps: first, a mathematical value (MV) is derived from the literal; second, this mathematical value is rounded as described below.
Once the exact MV for a numeric literal has been determined, it is then rounded to a value of the Number type. If the MV is 0, then the rounded value is +0; otherwise, the rounded value must be the Number value for the MV (as specified in 8.5), unless the literal is a DecimalLiteral and the literal has more than 20 significant digits, in which case the Number value may be either the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit or the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit and then incrementing the literal at the 20th significant digit position. A digit is significant if it is not part of an ExponentPart and
7.8.4 String Literals
NOTE A string literal is zero or more Unicode code points enclosed in single or double quotes. Unicode code points may also be be represented by an escape sequence. All characters may appear literally in a string literal except for the closing quote character, backslash, carriage return, line separator, paragraph separator, and line feed. Any character may appear in the form of an escape sequence. String literals evaluate to ECAMScript String values. When generating these string values Unicode code points are UTF-16 encoded as defined in clause 6. Code points belonging to Basic Multilingual Plane are encoded as a single code unit element of the string. All other code points are encoded as two code unit elements of the string.
Syntax
StringLiteral ::
"
DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one
of " or \ or LineTerminator
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one
of ' or \ or LineTerminator
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
A conforming implementation, when processing strict mode code (see 10.1.1), must not extend the syntax of EscapeSequence to include OctalEscapeSequence as described in B.1.2.
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u HexDigit
HexDigit HexDigit HexDigit
u{ HexDigits }
The definition of the nonterminal HexDigit is given in 7.8.3. SourceCharacter is defined in clause 6.
NOTE A line terminator character cannot appear in a string literal, except as part of a LineContinuation to produce the empty character sequence. The correct way to cause a line terminator character to be part of the String value of a string literal is to use an escape sequence such as \n or \u000A.
Static Semantics
Static Semantics: Early Errors
UnicodeEscapeSequence :: u{ HexDigits }
Static Semantics: SV’s and CV’s
A string literal stands for a value of the String type. The String value (SV) of the literal is described in terms of code unit values (CV) contributed by the various parts of the string literal. As part of this process, some Unicode characters within the string literal are interpreted as having a mathematical value (MV), as described below or in 7.8.3.
Table 4 — String Single Character Escape Sequences
|
Escape Sequence |
Code Unit Value |
Name |
Symbol |
|
\b |
0x0008 |
backspace |
<BS> |
|
\t |
0x0009 |
horizontal tab |
<HT> |
|
\n |
0x000A |
line feed (new line) |
<LF> |
|
\v |
0x000B |
vertical tab |
<VT> |
|
\f |
0x000C |
form feed |
<FF> |
|
\r |
0x000D |
carriage return |
<CR> |
|
\" |
0x0022 |
double quote |
" |
|
\' |
0x0027 |
single quote |
' |
|
\\ |
0x005C |
backslash |
\ |
7.8.5 Regular Expression Literals
NOTE A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by new RegExp (see 15.10.4) or calling the RegExp constructor as a function (15.10.3).
The productions below describe the syntax for a regular expression literal and are used by the input element scanner to find the end of the regular expression literal. The source code comprising the RegularExpressionBody and the RegularExpressionFlags are subsequently parsed using the more stringent ECMAScript Regular Expression grammar (15.10.1).
An implementation may extend the ECMAScript Regular Expression grammar defined in 15.10.1, but it must not extend the RegularExpressionBody and RegularExpressionFlags productions defined below or the productions used by these productions.
Syntax
RegularExpressionLiteral ::
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
RegularExpressionNonTerminator but not one of * or \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar ::
RegularExpressionNonTerminator but not one of \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence ::
\ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionClass ::
[ RegularExpressionClassChars ]
RegularExpressionClassChars ::
[empty]
RegularExpressionClassChars RegularExpressionClassChar
RegularExpressionClassChar ::
RegularExpressionNonTerminator but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags ::
[empty]
RegularExpressionFlags IdentifierPart
NOTE Regular expression literals may not be empty; instead of representing an empty regular expression literal, the characters // start a single-line comment. To specify an empty regular expression, use: /(?:)/.
Static Semantics: BodyText
RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
Static Semantics: FlagText
RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
7.8.6 Template Literal Lexical Components
Syntax
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
` TemplateCharactersopt `
TemplateHead ::
` TemplateCharactersopt ${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
} TemplateCharactersopt ${
TemplateTail ::
} TemplateCharactersopt `
TemplateCharacters ::
TemplateCharacter TemplateCharactersopt
TemplateCharacter ::
SourceCharacter but not one
of ` or \ or $
$ [lookahead ∉ { ]
\ EscapeSequence
LineContinuation
Static Semantics: TV’s and TRV’s
A template literal component is interpreted as a sequence of Unicode characters. The Template Value (TV) of a literal component is described in terms of code unit values (CV, 7.8.4) contributed by the various parts of the template literal component. As part of this process, some Unicode characters within the template component are interpreted as having a mathematical value (MV, 7.8.3). In determining a TV, escape sequences are replaced by the code unit of the Unicode characters represented by the escape sequence. The Template Raw Value (TRV) is similar to a Template Value with the difference that in TRVs escape sequences are interpreted literally.
NOTE TV excludes the code units of LineContinuation while TRV includes them.
7.9 Automatic Semicolon Insertion
Certain ECMAScript statements (empty statement, variable statement, expression statement, do-while statement, continue statement, break statement, return statement, and throw statement) must be terminated with semicolons. Such semicolons may always appear explicitly in the source text. For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.
7.9.1 Rules of Automatic Semicolon Insertion
There are three basic rules of semicolon insertion:
However, there is an additional overriding condition on the preceding rules: a semicolon is never inserted automatically if the semicolon would then be parsed as an empty statement or if that semicolon would become one of the two semicolons in the header of a for statement (see 12.6.3).
NOTE The following are the only restricted productions in the grammar:
PostfixExpression :
LeftHandSideExpression [no LineTerminator here] ++
LeftHandSideExpression [no LineTerminator here] --
ContinueStatement :
continue [no LineTerminator here] Identifier ;
BreakStatement :
break [no LineTerminator here] Identifier ;
ReturnStatement :
return [no LineTerminator here] Expression ;
ThrowStatement :
throw [no LineTerminator here] Expression ;
The practical effect of these restricted productions is as follows:
When a ++ or -- token is encountered where the parser would treat it as a postfix operator, and at least one LineTerminator occurred between the preceding token and the ++ or -- token, then a semicolon is automatically inserted before the ++ or -- token.
When a continue, break, return, or throw token is encountered and a LineTerminator is encountered before the next token, a semicolon is automatically inserted after the continue, break, return, or throw token.
The resulting practical advice to ECMAScript programmers is:
A postfix ++ or -- operator should appear on the same line as its operand.
An Expression in a return or throw statement should start on the same line as the return or throw token.
An Identifier in a break or continue statement should be on the same line as the break or continue token.
7.9.2 Examples of Automatic Semicolon Insertion
The source
{ 1 2 } 3
is not a valid sentence in the ECMAScript grammar, even with the automatic semicolon insertion rules. In contrast, the source
{ 1
2 } 3
is also not a valid ECMAScript sentence, but is transformed by automatic semicolon insertion into the following:
{ 1
;2 ;} 3;
which is a valid ECMAScript sentence.
The source
for (a; b
)
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion because the semicolon is needed for the header of a for statement. Automatic semicolon insertion never inserts one of the two semicolons in the header of a for statement.
The source
return
a + b
is transformed by automatic semicolon insertion into the following:
return;
a + b;
NOTE The expression a + b is not treated as a value to be returned by the return statement, because a LineTerminator separates it from the token return.
The source
a = b
++c
is transformed by automatic semicolon insertion into the following:
a = b;
++c;
NOTE The token ++ is not treated as a postfix operator applying to the variable b, because a LineTerminator occurs between b and ++.
The source
if (a > b)
else c = d
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion before the else token, even though no production of the grammar applies at that point, because an automatically inserted semicolon would then be parsed as an empty statement.
The source
a = b + c
(d + e).print()
is not transformed by automatic semicolon insertion, because the parenthesised expression that begins the second line can be interpreted as an argument list for a function call:
a = b + c(d + e).print()
In the circumstance that an assignment statement must begin with a left parenthesis, it is a good idea for the programmer to provide an explicit semicolon at the end of the preceding statement rather than to rely on automatic semicolon insertion.
8 Types
Algorithms within this specification manipulate values each of which has an associated type. The possible value types are exactly those defined in this clause. Types are further subclassified into ECMAScript language types and specification types.
Within this specification, the notation “Type(x)” is used as shorthand for “the type of x” where “type” refers to the ECMAScript language and specification types defined in this clause.
8.1 ECMAScript Language Types
An ECMAScript language type corresponds to values that are directly manipulated by an ECMAScript programmer using the ECMAScript language. The ECMAScript language types are Undefined, Null, Boolean, String, Number, and Object. An ECMAScript language value is a value that is characterized by an ECMAScript language type.
8.1.1 The Undefined Type
The Undefined type has exactly one value, called undefined. Any variable that has not been assigned a value has the value undefined.
8.1.2 The Null Type
The Null type has exactly one value, called null.
8.1.3 The Boolean Type
The Boolean type represents a logical entity having two values, called true and false.
8.1.4 The String Type
The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values (“elements”). The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a UTF-16 code unit value. Each element is regarded as occupying a position within the sequence. These positions are indexed with nonnegative integers. The first element (if any) is at index 0, the next element (if any) at index 1, and so on. The length of a String is the number of elements (i.e., 16-bit values) within it. The empty String has length zero and therefore contains no elements.
Where ECMAScript operations interpret String values, each element is interpreted as a single UTF-16 code unit. However, ECMAScript does not place any restrictions or requirements on the sequence of code units in a String value, so they may be ill-formed when interpreted as UTF-16 code unit sequences. Operations that do not interpret String contents treat them as sequences of undifferentiated 16-bit unsigned integers. No operations ensure that Strings are in a normalized form. Only operations that are explicitly specified to be language or locale sensitive produce language-sensitive results
NOTE The rationale behind this design was to keep the implementation of Strings as simple and high-performing as possible. If ECMAScript source code is in Normalised Form C, string literals are guaranteed to also be normalised, as long as they do not contain any Unicode escape sequences.
Some operations interpret String contents as UTF-16 encoded Unicode code points. In that case the interpretation is:
8.1.5 The Number Type
The Number type has exactly 18437736874454810627 (that is, 264−253+3) values, representing the double-precision 64-bit format IEEE 754 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic, except that the 9007199254740990 (that is, 253−2) distinct “Not-a-Number” values of the IEEE Standard are represented in ECMAScript as a single special NaN value. (Note that the NaN value is produced by the program expression NaN.) In some implementations, external code might be able to detect a difference between various Not-a-Number values, but such behaviour is implementation-dependent; to ECMAScript code, all NaN values are indistinguishable from each other.
There are two other special values, called positive Infinity and negative Infinity. For brevity, these values are also referred to for expository purposes by the symbols +∞ and −∞, respectively. (Note that these two infinite Number values are produced by the program expressions +Infinity (or simply Infinity) and -Infinity.)
The other 18437736874454810624 (that is, 264−253) values are called the finite numbers. Half of these are positive numbers and half are negative numbers; for every finite positive Number value there is a corresponding negative value having the same magnitude.
Note that there is both a positive zero and a negative zero. For brevity, these values are also referred to for expository purposes by the symbols +0 and −0, respectively. (Note that these two different zero Number values are produced by the program expressions +0 (or simply 0) and -0.)
The 18437736874454810622 (that is, 264−253−2) finite nonzero values are of two kinds:
18428729675200069632 (that is, 264−254) of them are normalised, having the form
s × m × 2e
where s is +1 or −1, m is a positive integer less than 253 but not less than 252, and e is an integer ranging from −1074 to 971, inclusive.
The remaining 9007199254740990 (that is, 253−2) values are denormalised, having the form
s × m × 2e
where s is +1 or −1, m is a positive integer less than 252, and e is −1074.
Note that all the positive and negative integers whose magnitude is no greater than 253 are representable in the Number type (indeed, the integer 0 has two representations, +0 and -0).
A finite number has an odd significand if it is nonzero and the integer m used to express it (in one of the two forms shown above) is odd. Otherwise, it has an even significand.
In this specification, the phrase “the Number value for x” where x represents an exact nonzero real mathematical quantity (which might even be an irrational number such as π) means a Number value chosen in the following manner. Consider the set of all finite values of the Number type, with −0 removed and with two additional values added to it that are not representable in the Number type, namely 21024 (which is +1 × 253 × 2971) and −21024 (which is −1 × 253 × 2971). Choose the member of this set that is closest in value to x. If two values of the set are equally close, then the one with an even significand is chosen; for this purpose, the two extra values 21024 and −21024 are considered to have even significands. Finally, if 21024 was chosen, replace it with +∞; if −21024 was chosen, replace it with −∞; if +0 was chosen, replace it with −0 if and only if x is less than zero; any other chosen value is used unchanged. The result is the Number value for x. (This procedure corresponds exactly to the behaviour of the IEEE 754 “round to nearest” mode.)
Some ECMAScript operators deal only with integers in the range −231 through 231−1, inclusive, or in the range 0 through 232−1, inclusive. These operators accept any value of the Number type but first convert each such value to one of 232 integer values. See the descriptions of the ToInt32 and ToUint32 operators in 9.5 and 9.6, respectively.
8.1.6 The Object Type
An Object is logically a collection of properties. Each property is either a data property, or an accessor property:
Property are identified using key values. A key value is either an ECMAScript String value or an ECMAScript Symbol object (??.??.??).
There are two kinds of access for properties: get and set, corresponding to value retrieval and assignment, respectively. The properties accessable via get and set access includes both own properties that are a direct part of an object and inherited properties which are provided by another associated object via a property inheritance relationship. Inherited properties may be either own or inherited properites of the associated object.
All objects are logically collections of properties, but there are multiple forms of objacts that differ in their semanjtics for accessing and manipulating their properties. Ordinary object are the most common form of objects and have the default object semantics, An exotic object is any form of object whose property semantics differ in any way from the default semantics.
8.1.6.1 Property Attributes
Attributes are used in this specification to define and explain the state of Object properties. A data property associates a key value with the attributes listed in Table 5.
Table 5 — Attributes of a Data Property
|
Attribute Name |
Value Domain |
Description |
|
[[Value]] |
Any ECMAScript language type |
The value retrieved by a get access of the property. |
|
[[Writable]] |
Boolean |
If false, attempts by ECMAScript code to change the property’s [[Value]] attribute using [[SetP]] or [[DefineOwnProperty]] will not succeed. |
|
[[Enumerable]] |
Boolean |
If true, the property will be enumerated by a for-in enumeration (see 12.6.4). Otherwise, the property is said to be non-enumerable. |
|
[[Configurable]] |
Boolean |
If false, attempts to delete the property, change the property to be an accessor property, or change its attributes (other than [[Value]], for changing [[Writable]] to false) will fail. |
An accessor property associates a key value with the attributes listed in Table 6.
Table 6 — Attributes of a Named Accessor Property
|
Attribute Name |
Value Domain |
Description |
|
[[Get]] |
Object or Undefined |
If the value is an Object it must be a function Object. The function’s [[Call]] internal method (8.6.2) is called with an empty arguments list to retrieve the property value each time a get access of the property is performed. |
|
[[Set]] |
Object or Undefined |
If the value is an Object it must be a function Object. The function’s [[Call]] internal method (8.6.2) is called with an arguments list containing the assigned value as its sole argument each time a set access of the property is performed. The effect of a property's [[SetP]] internal method may, but is not required to, have an effect on the value returned by subsequent calls to the property's [[GetP]] internal method. |
|
[[Enumerable]] |
Boolean |
If true, the property is to be enumerated by a for-in enumeration (see 12.6.4). Otherwise, the property is said to be non-enumerable. |
|
[[Configurable]] |
Boolean |
If false, attempts to delete the property, change the property to be a data property, or change its attributes will fail. |
If the initial values of a property’s attributes are not explicitly specified by this specification, the default value defined in Table 7 is used.
Table 7 — Default Attribute Values
|
Attribute Name |
Default Value |
|
[[Value]] |
undefined |
|
[[Get]] |
undefined |
|
[[Set]] |
undefined |
|
[[Writable]] |
false |
|
[[Enumerable]] |
false |
|
[[Configurable]] |
false |
8.1.6.2 Object Internal Methods and Internal Data Properties
The actual semantics of ECMAScript objects are specified via algorithms called internal methods. Each object in an ECMAScript engine is associated with a set of internal methods that defines its runtime behaviour. These internal methods are not part of the ECMAScript language. They are defined by this specification purely for expository purposes. However, each object within an implementation of ECMAScript must behave as specified by the internal methods associated with it. The exact manner in which this is accomplished is determined by the implementation.
Internal methods are identified within this specification using names enclosed in double square brackets [[ ]]. Internal method names are polymorphic. This means that different ECMAScript object values may perform different algorithms when a common internal method name is invoke upon them. If, at runtime, the implementation of an algorithm attempts to use an internal method of an object that the object does not support, a TypeError exception is thrown.
Internal data properties correspond to internal state that is associated with objects and used by various ECMAScript specification algorithms. Depending upon the specific internal data property such state may consist of values of any ECMAScript language type or of specific ECMA specification type values. Unless explicitly specified otherwise, internal data properties may be dynamically added to ECMAScript objects.
Table 8 summarises the essential internal methods used by this specification that are applicable to all ECMAScript objects. Every object must have algorithms for all of the essential internal methods. However, all objects do not necessarily use the same algorithms for those methods.
The “Signature” column of Table 8 and other similar tables describes the invocation pattern for each internal method. The invocation pattern always includes a parenthesised list of descriptive parameter names. If a parameter name is the same as an ECMAScript type name then the name describes the required type of the parameter value. If an internal method explicitly returns a value, its parameter list is followed by the symbol “→” and the type name of the returned value. The type names used in signatures refer to the types defined in Clause 8 augmented by the following additional names. “any” means the value may be any ECMAScript language type. “primitive” means Undefined, Null, Boolean, String, or Number. An internal method implicitly returns a Completion Record as described in 8.8. In addition to its parameters, an internal method always has access to the object upon which it is invoked as a method.
Table 8 — Essential Internal Methods
|
Internal Method |
Signature |
Description |
|
[[GetInheritance]] |
()→Object or Null |
Determine the object that provides inherited properties for this object. A null value indicates that there are no inherited properties. an object. |
|
[[SetInheritance]] |
(Object or Null) |
Associate with an object another object that provides inherited properties. Passing null indicates that there are no inherited properties. |
|
[[IsExtensible]] |
()→Boolean |
Determine whether it is permitted to add additional properties to an object. |
|
[[preventExtensions]] |
() |
Control whether new properties may be added to an object. |
|
[[HasOwnProperty]] |
(propertyKey) → Boolean |
Returns a Boolean value indicating whether the object already has an own property whose key is propertyKey. |
|
[[GetOwnProperty]] |
(propertyKey) → Undefined or Property Descriptor |
Returns a Property Descriptor for the own property of this object whose key is propertyKey, or undefined if no such property exists. |
|
[[GetP]] |
(propertyKey, Receiver) → any |
Retrive the value of an object’s property using the propertyKey parameter. If any ECMAScript code must be executed to retrieve the property value, Receiver is used as the this value when evaluating the code. |
|
[[SetP]] |
(propertyKey,value, Receiver) → Boolean |
Try to set the value of an object’s property indentified by propertyKey to value. If any ECMAScript code must be executed to set the property value, Receiver is used as the this value when evaluating the code. Returns true indicating that the property value was set or false indicating that it could not be set. |
|
[[Delete]] |
(propertyKey) → Boolean |
Removes the own property indentified by the propertyKey parameter from the object. Return false is the property was not deleted because its [[Configurable]] attribute is false. Otherwise return true. |
|
[[DefineOwnProperty]] |
(propertyKey, PropertyDescriptor) → Boolean |
Creates or alters the named own property to have the state described by a Property Descriptor. Returns true indicating that the property was successfully created/updated or false indicating that the property could not be created or updated. |
|
[[Enumerate]] |
()→Object |
Returns an iterator object that over the string values of the keys of the enumerable properties of the object. |
|
[[Keys]] |
()→List of String |
Returns an Array containing all of the enumerable own property keys for the object that are Strings. |
|
[[OwnPropertyKeys]] |
()→List of (String or Symbol) |
Returns an Array containing all of the own property keys for the object except those that are private Symbols. |
|
[[Freeze]] |
() → Boolean |
|
|
[[Seal]] |
() → Boolean |
|
|
[[IsFrozen]] |
() → Boolean |
|
|
[[IsSealed]] |
() → Boolean |
Table 9 summarises additional essential internal methods that must be supported by all objects that may be called as functions..
Table 9 — Addional Essential Internal Method of Function Objects
|
Internal Method |
Value Type Domain |
Description |
|
[[Call]] |
(any, a List of any) → any or Reference |
Executes code associated with the object. Invoked via a function call expression. The arguments to the internal method are a this value and a list containing the arguments passed to the function by a call expression. Objects that implement this internal method are callable. Only callable objects that are host objects may return Reference values. |
|
[[Construct]] |
(a List of any) → Object |
Creates an object. Invoked via the new operator. The arguments to the internal are the arguments passed to the new operator. Objects that implement this internal method are called constructors. |
8.1.6.2 Invariants of the Essential Internal Methods
Current this section is just a bunch of material merged together from the ES5 spec. and from the wiki Proxy pages. It need to be completely reworked.
The intent is that it lists all invariants of the Essential Internal Methods. This includes both invariants that are enforced for Proxy objects and other invariants that may not be enfored.
Definitions:
Exotic objects may define additional constraints upon their [[SetP]] internal method behavior. If possible, exotic objects should not allow [[SetP]] operations in situations where this definition of [[CanPut]] returns false.
[[GetInheritance]]
Every [[Prototype]] chain must have finite length (that is, starting from any object, recursively accessing the [[Prototype]] internal data property must eventually lead to a null value).
getOwnPropertyDescriptor
Non-configurability invariant: cannot return incompatible descriptors for sealed properties
Non-extensibility invariant: must return undefined for new properties
Invariant checks:
if trap returns undefined, check if the property is configurable
if property exists on target, check if the returned descriptor is compatible
if returned descriptor is non-configurable, check if the property exists on the target and is also non-configurable
defineProperty
Non-configurability invariant: cannot succeed (return true) for incompatible changes to sealed properties
Non-extensibility invariant: must reject (return false) for new properties
Invariant checks:
on success, if property exists on target, check if existing descriptor is compatible with argument descriptor
on success, if argument descriptor is non-configurable, check if the property exists on the target and is also non-configurable
getOwnPropertyNames
Non-configurability invariant: must report all sealed properties
Non-extensibility invariant: must not list new property names
Invariant checks:
check whether all sealed target properties are present in the trap result
If the target is non-extensible, check that no new properties are listed in the trap result
deleteProperty
Non-configurability invariant: cannot succeed (return true) for sealed properties
Invariant checks:
on success, check if the target property is configurable
getPrototypeOf
Invariant check: check whether the target’s prototype and the trap result are identical (according to the egal operator)
freeze | seal | preventExtensions
Invariant checks:
on success, check if isFrozen(target), isSealed(target) or !isExtensible(target)
isFrozen | isSealed | isExtensible
Invariant check: check whether the boolean trap result is equal to isFrozen(target), isSealed(target) or isExtensible(target)
hasOwn
Non-configurability invariant: cannot return false for sealed properties
Non-extensibility invariant: must return false for new properties
Invariant checks:
if false is returned, check if the target property is configurable
if false is returned, the property does not exist on target, and the target is non-extensible, throw a TypeError
has
Non-configurability invariant: cannot return false for sealed properties
Invariant checks:
if false is returned, check if the target property is configurable
get
Non-configurability invariant: cannot return inconsistent values for frozen data properties, and must return undefined for sealed accessors with an undefined getter
Invariant checks:
if property exists on target as a data property, check whether the target property’s value and the trap result are identical (according to the egal operator)
if property exists on target as an accessor, and the accessor’s get attribute is undefined, check whether the trap result is also undefined.
set
Non-configurability invariant: cannot succeed (return true) for frozen data properties or sealed accessors with an undefined setter
Invariant checks:
on success, if property exists on target as a data property, check whether the target property’s value and the update value are identical (according to the egal operator)
on success, if property exists on target as an accessor, check whether the accessor’s set attribute is not undefined
keys
Non-configurability invariant: must report all enumerable sealed properties
Non-extensibility invariant: must not list new property names
Invariant checks:
Check whether all enumerable sealed target properties are listed in the trap result
If the target is non-extensible, check that no new properties are listed in the trap result
enumerate
Non-configurability invariant: must report all enumerable sealed properties
Invariant checks:
Check whether all enumerable sealed target properties are listed in the trap result
The “Value Type Domain” columns of the following tables define the types of values associated with internal properties. The type names refer to the types defined in Clause 8 augmented by the following additional names. “any” means the value may be any ECMAScript language type. “primitive” means Undefined, Null, Boolean, String, or Number.
NOTE This specification defines no ECMAScript language operators or built-in functions that permit a program to modify an object’s [[Prototype]] internal properties or to change the value of [[Extensible]] from false to true. Implementation specific extensions that modify [[Prototype]] or [[Extensible]] must not violate the invariants defined in the preceding paragraph.
Unless otherwise specified, the standard ECMAScript objects are ordinary objects and behave as described in 8.3. Some standard objects are exotic objects and have behaviour defined in 8.4..
Exotic objects may implement internal methods in any manner unless specified otherwise; for example, one possibility is that [[GetP]] and [[SetP]] for a particular exotic object indeed fetch and store property values but [[HasOwnProperty]] always generates false. However, if any specified manipulation of an exotic object's internal properties is not supported by an implementation, that manipulation must throw a TypeError exception when attempted.
The [[GetOwnProperty]] internal method of all objects must conform to the following invariants for each property of the object:
The [[DefineOwnProperty]] internal method of all objects must not permit the addition of a new property to an object if the [[Extensible]] internal method of that object has been observed by ECMAScript code to be false.
If the result of calling the [[IsExtensible]] internal method of an object has been observed by ECMAScript code to be false then it must not subsequently become true.
8.2 ECMAScript Specification Types
A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types are Reference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment, Environment Record, and Data Block. Specification type values are specification artefacts that do not necessarily correspond to any specific entity within an ECMAScript implementation. Specification type values may be used to describe intermediate results of ECMAScript expression evaluation but such values cannot be stored as properties of objects or values of ECMAScript language variables.
8.2.1 Data Blocks
This section is a placeholder for describing the Data Block internal type. The following material is verbatium from the the Binary Data ES wiki proposal. The material has not yet been reviewed or integrated with the rest of this spec.
This spec introduces a new, spec-internal block datatype, intuitively representing a contiguously allocated block of binary data. Blocks are not ECMAScript language values and appear only in the program store (aka heap).
A block is one of:
A number-block is one of:
A uintk is an integer in the range [0, 2k). An intk is an integer in the range [-2k-1, 2k-1). A floatk is a floating-point number representable as a k-bit IEE754 value.
An array-block[t, n] is an ordered sequence of n blocks of homogeneous block type t. Each element of the array is stored at in independently addressable location in the program store, and multiple Data objects may contain references to the element.
A struct-block[t1, ..., tn] is an ordered sequence of n blocks of heterogeneous types t1 to tn, respectively. Each field of the struct is stored at in independently addressable location in the program store, and multiple Data objects may contain references to the field.
The spec also introduces a datatype of Data objects, which are ECMAScript objects that encapsulate references to block data in the program store. Every Data object has the following properties:
[[Class]] = “Data”
[[Value]] : reference[block] – a reference to a block in the program store
[[DataType]] : reference[Type] – a reference to a Type object describing this object’s data block
8.2.2 The List and Record Specification Type
The List type is used to explain the evaluation of argument lists (see 11.2.4) in new expressions, in function calls, and in other algorithms where a simple list of values is needed. Values of the List type are simply ordered sequences of values. These sequences may be of any length.
The Record type is used to describe data aggregations within the algorithms of this specification. A Record type value consists of one or more named fields. The value of each field is either an ECMAScript value or an abstract value represented by a name associated with the Record type. Field names are always enclosed in double brackets, for example [[value]]
For notational convenience within this specification, an object literal-like syntax can be used to express a Record value. For example, {[[field1]]: 42, [[field2]]: false, [[field3]]: empty} defines a Record value that has three fields each of which is initialized to a specific value. Field name order is not significant. Any fields that are not explicitly listed are considered to be absent.
In specification text and algorithms, dot notation may be used to refer to a specific field of a Record value. For example, if R is the record shown in the previous paragraph then R.[[field2]] is shorthand for “the field of R named [[field2]]”.
Schema for commonly used Record field combinations may be named, and that name may be used as a prefix to a literal Record value to identify the specific kind of aggregations that is being described. For example: Property Descriptor {[[Value]]: 42, [[Writable]]: false, [[Configurable]]: true}.
8.2.3 The Completion Record Specification Type
The Completion type is a Record used to explain the runtime propagation of values and control flow such as the behaviour of statements (break, continue, return and throw) that perform nonlocal transfers of control.
Values of the Completion type are Record values whole fields are defined as by Table 10.
Table 10 — Completion Record Fields
|
Field Name |
Value |
Meaning |
|
[[type]] |
One of normal, break, continue, return, or throw |
The type of completion that occurred. |
|
[[value]] |
any ECMAScript language value or empty |
The value that was produced. |
|
[[target]] |
any ECMAScript identifier or empty |
The target label for directed control transfers. |
The term “abrupt completion” refers to any completion with a [[type]] value other than normal.
8.2.3.1 NormalCompletion
The abstract operation NormalCompletion with a single argument, such as:
Is a short hand that is defined as follows:
8.2.3.2 Implicit Completion Values
The algorithms of this specification often implicitly return Completion Records whose [[type]] is normal. Unless it is otherwise obvious from the context, an algorithm statement that returns a value that is not a Completion Record, such as:
means the same thing as:
A “return” statement without a value in an algoritm step means the same thing as:
Similarly, any reference to a Completion Record value that is in a context that does not explicitly require a complete Completion Record value is equivalent to an explicit reference to the [[value]] field of the Completion Record value unless the Completion Record is an abrupt completion.
8.2.3.3 Throw an Exception
Algorithms steps that say to throw an exception, such as
Mean the same things as:
8.2.3.4 ReturnIfAbrupt
Algorithms steps that say
mean the same things as:
8.2.4 The Reference Specification Type
NOTE The Reference type is used to explain the behaviour of such operators as delete, typeof, the assignment operators, the super keyword and other lanauge features. For example, the left-hand operand of an assignment is expected to produce a reference.
A Reference is a resolved name binding. A Reference consists of three components, the base value, the referenced name and the Boolean valued strict reference flag. The base value is either undefined, an Object, a Boolean, a String, a Number, or an environment record (10.2.1). A base value of undefined indicates that the Reference could not be resolved to a binding. The referenced name is a String.
A Super Reference is a Reference that is used to represents a name binding that was expressed using the super keyword. A Super Reference has an additional thisValue component and its base value will never be an environment record.
The following abstract operations are used in this specification to access the components of references:
The following abstract operations are used in this specification to operate on references:
8.2.4.1 GetValue (V)
NOTE The object that may be created in step 5.a.ii is not accessible outside of the above method. An implementation might choose to avoid the actual creation of the object.
8.2.4.2 PutValue (V, W)
NOTE The object that may be created in step 6.a.ii is not accessible outside of the above algorithm. An implementation might choose to avoid the actual creation of that transient object.
8.2.4.3 GetThisValue (V)
8.2.5 The Property Descriptor Specification Types
The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are Records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.1.6.1. In addition, any field may be present or absent.
Property Descriptor values may be further classified as data property descriptors and accessor property descriptors based upon the existence or use of certain fields. A data property descriptor is one that includes any fields named either [[Value]] or [[Writable]]. An accessor property descriptor is one that includes any fields named either [[Get]] or [[Set]]. Any property descriptor may have fields named [[Enumerable]] and [[Configurable]]. A Property Descriptor value may not be both a data property descriptor and an accessor property descriptor; however, it may be neither. A generic property descriptor is a Property Descriptor value that is neither a data property descriptor nor an accessor property descriptor. A fully populated property descriptor is one that is either an accessor property descriptor or a data property descriptor and that has all of the fields that correspond to the property attributes defined in either 8.1.6.1 Table 5 or Table 6.
A Property Descriptor may be derived from an ECMAScript object that has properties that directly correspond to the fields of a Property Descriptor. Such a derived Property Descriptor has an additional field named [[Origin]] whose value is the object from which the Property Descriptor was derived.
The following abstract operations are used in this specification to operate upon Property Descriptor values:
8.2.5.1 IsAccessorDescriptor ( Desc )
When the abstract operation IsAccessorDescriptor is called with property descriptor Desc, the following steps are taken:
8.2.5.2 IsDataDescriptor ( Desc )
When the abstract operation IsDataDescriptor is called with property descriptor Desc, the following steps are taken:
8.2.5.3 IsGenericDescriptor ( Desc )
When the abstract operation IsGenericDescriptor is called with property descriptor Desc, the following steps are taken:
8.2.5.4 FromPropertyDescriptor ( Desc )
When the abstract operation FromPropertyDescriptor is called with property descriptor Desc, the following steps are taken:
The following algorithm assumes that Desc is a fully populated Property Descriptor, such as that returned from [[GetOwnProperty]] (see 8.12.1).
8.2.5.5 ToPropertyDescriptor ( Obj )
When the abstract operation ToPropertyDescriptor is called with object Obj, the following steps are taken:
8.2.5.6 CompletePropertyDescriptor ( Desc, LikeDesc )
When the abstract operation CompletePropertyDescriptor is called with Property Descriptor Record Desc, the following steps are taken:
8.2.6 The Lexical Environment and Environment Record Specification Types
The Lexical Environment and Environment Record types are used to explain the behaviour of name resolution in nested functions and blocks. These types and the operations upon them are defined in Clause 10.
8.3 Ordinary Object Internal Methods and Internal Data Properties
Sections 8.3-8.5 will eventually be subsectons of a new toplevel section that follow the current section 10
All ordinary objects have an internal data property called [[Prototype]]. The value of this property is either null or an object and is used for implementing inheritance. Data properties of the [[Prototype]] object are inherited (are visible as properties of the child object) for the purposes of get access, but not for set access. Accessor properties are inherited for both get access and set access.
Every ordinary ECMAScript object has a Boolean-valued [[Extensible]] internal data property that controls whether or not properties may be added to the object. If the value of the [[Extensible]] internal data property is false then additional named properties may not be added to the object. In addition, if [[Extensible]] is false the value of [[Prototype]] internal data properties of the object may not be modified. Once the value of an object’s [[Extensible]] internal data property has been set to false it may not be subsequently changed to true.
In the following algorithm descriptions, assume O is an ordinary ECMAScript object, P is a property key value, V is any ECMAScript language value, Desc is a Property Description record, and B is a Boolean flag.
8.3.1 [[GetInheritance]] ( )
When the [[GetInheritance]] internal method of O is called the following steps are taken:
8.3.2 [[SetInheritance]] (V)
When the [[SetInheritance]] internal method of O is called with argument V the following steps are taken:
8.3.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of O is called the following steps are taken:
8.3.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of O is called the following steps are taken:
8.3.5 [[HasOwnProperty]] (P)
When the [[HasOwnProperty]] internal method of O is called with property key P, the following steps are taken:
8.3.6 [[GetOwnProperty]] (P)
When the [[GetOwnProperty]] internal method of O is called with property key P, the following steps are taken:
8.3.6.1 OrdinaryGetOwnProperty (O, P)
When the abstract operation OrdinaryGetOwnProperty is called with Object O and with property key P, the following steps are taken:
8.3.7 [[GetP]] (P, Receiver)
When the [[GetP]] internal method of O is called with property key P and ECMAScipt language value Receiver the following steps are taken:
8.3.8 [[SetP] ( P, V, Receiver)
When the [[SetP]] internal method of O is called with property key P, value V, and ECMAScipt language value Receiver, the following steps are taken:
8.3.9 [[HasProperty]] (P)
When the [[HasProperty]] internal method of O is called with property key P, the following steps are taken:
8.3.4 [[CanPut]] (P)
When the [[CanPut]] internal method of O is called with property name P, the following steps are taken:
Exotic objects may define additional constraints upon their [[SetP]] internal method behavior. If possible, exotic objects should not allow [[SetP]] operations in situations where this definition of [[CanPut]] returns false.
8.3.9 [[Delete]] (P)
When the [[Delete]] internal method of O is called with property key P the following steps are taken:
8.3.10 [[DefineOwnProperty]] (P, Desc)
When the [[DefineOwnProperty]] internal method of O is called with property key P and property descriptor Desc, the following steps are taken:
8.3.10.1 OrdinaryDefineOwnProperty (O, P, Desc)
When the abstract operation OrdinaryDefineOwnProperty is called with Object O, property key P, and property descriptors Desc the following steps are taken:
8.3.10.2 IsCompatableDescriptor (Extensible, Desc, Current)
When the abstract operation IsCompatablePropertyDesriptor is called with Boolean value Extensible, and property descriptors Desc, and Current the following steps are taken:
8.3.10.3 ValidateAndApplyPropertyDescriptor (O, P, extensible, Desc, current)
When the abstract operation ValidateAndApplyPropertyDescriptor is called with Object O, property key P, Boolean value extensible, and property descriptors Desc, and current the following steps are taken:
This algorithm contains steps that test various fields of the Property Descriptor Desc for specific values. The fields that are tested in this manner need not actually exist in Desc. If a field is absent then its value is considered to be false.
NOTE If undefined is passed as the O argument only validation is performed and not object updates are preformed.
However, if O has an [[BuiltinBrand]] internal data property whose value is BuiltinArray O also has a more elaborate [[DefineOwnProperty]] internal method defined in 15.4.5.1.
NOTE Step 10.b allows any field of Desc to be different from the corresponding field of current if current’s [[Configurable]] field is true. This even permits changing the [[Value]] of a property whose [[Writable]] attribute is false. This is allowed because a true [[Configurable]] attribute would permit an equivalent sequence of calls where [[Writable]] is first set to true, a new [[Value]] is set, and then [[Writable]] is set to false.
8.3.11 [[DefaultValue]] (hint)
When the [[DefaultValue]] internal method of O is called with hint String, the following steps are taken:
When the [[DefaultValue]] internal method of O is called with hint Number, the following steps are taken:
When the [[DefaultValue]] internal method of O is called with no hint, then it behaves as if the hint were Number, unless O is a Date object (see 15.9.6), in which case it behaves as if the hint were String.
The above specification of [[DefaultValue]] for ordinary objects can return only primitive values. If an exotic object implements its own [[DefaultValue]] internal method, it must ensure that its [[DefaultValue]] internal method can return only primitive values.
8.3.11 [[Enumerate]] ()
When the [[Enumerate]] internal method of O is called the following steps are taken:
Enumerated properties do not include properties whose property key is a Symbol. Properties of the object being enumerated may be deleted during enumeration. If a property that has not yet been visited during enumeration is deleted, then it will not be visited. If new properties are added to the object being enumerated during enumeration, the newly added properties are not guaranteed to be visited in the active enumeration. A property name must not be visited more than once in any enumeration.
Enumerating the properties of an object includes enumerating properties of its prototype, and the prototype of the prototype, and so on, recursively; but a property of a prototype is not enumerated if it is “shadowed” because some previous object in the prototype chain has a property with the same name. The values of [[Enumerable]] attributes are not considered when determining if a property of a prototype object is shadowed by a previous object on the prototype chain.
The following is an informative algorithm that conforms to these rules
8.3.12 [[Keys]] ( )
When the [[Keys]] internal method of O is called the following steps are taken:
If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used in step 5 of this algorithm.
8.3.13 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of O is called the following steps are taken:
8.3.14 [[Freeze]] ( )
When the [[Freeze]] internal method of O is called the following steps are taken:
8.3.15 [[Seal]] ( )
When the [[Seal]] internal method of O is called the following steps are taken:
8.3.16 [[IsFrozen]] ( )
When the [[IsFrozen]] internal method of O is called the following steps are taken:
8.3.17 [[IsSealed]] ( )
When the [[IsSealed]] internal method of O is called the following steps are taken:
8.3.18 ObjectCreate Abstract Operation
The abstract operation ObjectCreate with optional argument proto (an object or null) is used to specify the runtime creation of new ordinary objects. It performs the following steps:
8.3.19 Ordinary Function Objects
Ordinary function objects encapsulate parameterized ECMAScript code closed over a lexical environment and support the dynamic evaluation of that code. An ordinary function object is an ordinary object and has the same internal data properties and (except as noted below) the same internal methods as other ordinary objects.
Ordinary function objects have the additional internal data properties listed in Table 11. They also have a [[BuiltinBrand]] internal data property whose value is BuiltinFunction.
Ordinary function objects provide alternative definitions for the [[GetP]] and [[GetOwnProperty]] internal methods. These alternatives prevent the value of strict mode function from being revealed as the value of a function object property named "caller". These alternative definitions exist sole to preclude a non-standard legacy feature of some ECMAScript implementations from revealing information about strict mode callers. If an implementation does not provide such a feature, it need not implement these alternative internal methods for ordinary function objects.
Table 11 -- Internal Data Properties of Ordinary Function Objects
|
Internal Data Property |
Type |
Description |
|
[[Scope]] |
Lexical Environment |
The Lexical Environment that the function was closed over. Is used as the outer environment when evaluating the code of the function. |
|
[[FormalParameters]] |
Parse Node |
The root parse node of the source code that defines the function’s formal parameter list. |
|
[[Code]] |
Parse Node |
The root parse node of the source code that defines the function’s body. |
|
[[Realm]] |
Realm Record |
The Code Realm in which the function was created and which provides any intrinsic objects that are accessed when evaluating the function. |
|
[[ThisMode]] |
(lexical, strict, global) |
Defines how this references are interpreted within the formal parameters and code body of the function. lexical means that this refers to the this value of a lexically enclosing function. strict means that the this value is used exactly as provided by an invocation of the function. global means that a this value of undefined is interpreted as a reference to the global object. |
|
[[Strict]] |
Boolean |
true if this is a strict mode function, false this is not a strict mode function. |
|
[[Home]] |
Object |
If the function uses super, this is the object whose [[Inheritance]] provides the object where super property lookups begin. Not present for functions that don’t reference super. |
|
[[MethodName]] |
String or Symbol |
If the function uses super, this is the property keys that is used for unqualified references to super. Not present for functions that don’t reference super. |
Ordinary function objects all have the [[Call]], [[GetP]] and [[GetOwnProperty]] internal methods defined here. Oridinary functions that are also constructors in addition have the [[Construct]] internal method.
8.3.19.1 [[Call]] Internal Method
The [[Call]] internal method for an ordinary Function object F is called with parameters thisArgument and argumentsList, a List of ECMAScript language values. The following steps are taken:
8.3.19.2 [[Construct]] Internal Method
The [[Construct]] internal method for an ordinary Function object F is called with a single parameter argumentsList which is a possibly empty List of ECMAScript language values. The following steps are taken:
8.3.19.3 [[GetP]] (P, Receiver)
When the [[GetP]] internal method of ordinary function object F is called with property key P and ECMAScipt language value Receiver the following steps are taken:
8.3.19.4 [[GetOwnProperty]] (P)
When the [[GetOwnProperty]] internal method of ordinary function object F is called with property key P, the following steps are taken:
8.4 Built-in Exotic Object Internal Methods and Data Fields
This specification define several kinds of built-in exotic objects. These objects generally behave similar to ordinary objects except for a few specific situtations. The following exotic objects use the ordinary object internal methods except where it is explicitly specified wise below:
8.4.1 Bound Function Exotic Objects
A bound function is an exotic object that wrappers another function object. A bound function is callable (it has [[Call]] and [[Construct]] internal methods). Calling a bound function generally results in a call of its wrappered function.
Bound function objects do not have the internal data properties of ordinary function objects defined in Table 11. Instead they have the internal data properties defined in Table 12. They also have a [[BuiltinBrand]] internal data property whose value is BuiltinFunction.
Table 12 -- Internal Data Properties of Exotic Bound Function Objects
|
Internal Data Property |
Type |
Description |
|
[[BoundTargetFunction]] |
Callable Object |
The wrappered function object. |
|
[[BoundThis]] |
Any |
The value that is always passed as the this value when calling the wrappered function. |
|
[[BoundArguments]] |
List of Any |
A list of values that whose elements are used as the first arguments to any call to the wrappered function. |
Unlike ordinary function objects, bound function objects do not use alternative definitions of the [[GetP]] and [[GetOwnPropety]] internal methods. Bound function objects provide all of the essential internal methods as specified in 8.3. However, they use the following definitions for the essential internal methods of function objects.
8.4.1.1 [[Call]]
When the [[Call]] internal method of an exotic bound function object, F, which was created using the bind function is called with parameters thisArgument and argumentsList, a List of ECMAScript language values, the following steps are taken:
8.4.1.2 [[Construct]]
When the [[Construct]] internal method of an exotic bound function object, F that was created using the bind function is called with a list of arguments ExtraArgs, the following steps are taken:
8.4.1.3 BoundFunctionCreate Abstract Operation
The abstract operation BoundFunctionCreate with arguments targetFunction, boundThis and boundArgs is used to specify the creation of new Object objects. It performs the following steps:
8.4.2 Array Exotic Objects
An Array object is an exotic object give special treatment to a certain class of property names. A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 232−1. A property whose property name is an array index is also called an element. Every Array object has a length property whose value is always a nonnegative integer less than 232. The value of the length property is numerically greater than the name of every property whose name is an array index; whenever a property of an Array object is created or changed, other properties are adjusted as necessary to maintain this invariant. Specifically, whenever a property is added whose name is an array index, the length property is changed, if necessary, to be one more than the numeric value of that array index; and whenever the length property is changed, every property whose name is an array index whose value is not smaller than the new length is automatically deleted. This constraint applies only to own properties of an Array object and is unaffected by length or array index properties that may be inherited from its prototypes.
Exotic Array objects always have a non-configurable property named "length".
Exotic Array objects have the same internal data properties as ordinary objects. They also have a [[BuiltinBrand]] internal data property whose value is BuiltinArray.
Exotic Array objects provide alternative definitions for the [[SetP]] and [[DefineOwnProperty]] internal methods. Except for these two internal methods, exotic Array objects provide all of the other essential internal methods as specified in 8.3.
8.4.2.1 [[SetP] ( P, V, Receiver)
When the [[SetP]] internal method of an an exotic Array object O is called with property key P, value V, and ECMAScipt language value Receiver, the following steps are taken:
NOTE This algorithm differs from the ordinary object [[SetP]] algorithm only in the handling of properties with the name"length" in step 5.b.ii.1.
8.4.2.2 [[DefineOwnProperty]] ( P, Desc)
When the [[DefineOwnProperty]] internal method of an exotic Array object A is called with property P, and Property Descriptor Desc the following steps are taken:
8.4.2.3 ArrayCreate Abstract Operation
The abstract operation ArrayCreate with argument length (a positive integer) is used to specify the creation of new exotic Array objects. It performs the following steps:
8.4.2.3 ArraySetLength Abstract Operation
When the abstract operation ArraySetLength is called with an exotic Array object A, and Property Descriptor Desc the following steps are taken:
8.4.3 String Exotic Objects
A String object is an exotic object that encapsulates a String value and exposes virtual array index data properties corresponding to the individual code unit elements of the string value. Exotic String objects always have a data property named "length" whose value is the number of code unit elements in the encapsulated String value. Both the code unit data properties and the "length" property are non-writable and non-configurable.
Exotic String objects have the same internal data properties as ordinary objects. They also have a [[StringData]] internal data property and a [[BuiltinBrand]] internal data property whose value is BuiltinStringWrapper.
Exotic String objects provide alternative definitions for the following internal methods. All of the other exotic String object essential internal methods that are not defined below are as specified in 8.3.
8.4.3.1 [[HasOwnProperty]] (P)
When the [[HasOwnProperty]] internal method of exotic String object O is called with property key P, the following steps are taken:
8.4.3.2 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of an an exotic String object S is called with property key P the following steps are taken:
8.4.3.3 [[GetP]] (P, Receiver)
When the [[GetP]] internal method of exotic String object O is called with property key P and ECMAScipt language value Receiver the following steps are taken:
NOTE This algorithm differs from the ordinary object [[SetP]] algorithm only in invocation of [[GetOwnProperty]] in step 2.
8.4.3.4 [[Delete]] (P)
When the [[Delete]] internal method of exotic String object O is called with property name P the following steps are taken:
NOTE This algorithm differs from the ordinary object [[Delete]] algorithm only in invocation of [[GetOwnProperty]] in step 2.
8.4.3.5 [[DefineOwnProperty]] ( P, Desc)
When the [[DefineOwnProperty]] internal method of an exotic String object O is called with property P, and Property Descriptor Desc the following steps are taken:
NOTE This algorithm differs from the ordinary object OrdinaryDefineOwnProperty abstract operation algorithm only in invocation of [[GetOwnProperty]] in step 1.
8.4.3.6 [[Enumerate]] ()
When the [[Enumerate]] internal method of an exotic String object O is called the following steps are taken:
8.4.3.7 [[Keys]] ( )
When the [[Keys]] internal method of an exotic String object O is called the following steps are taken:
8.4.3.8 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of an exotic String object O is called the following steps are taken:
8.4.4 Exotic Symbol Objects
An Symbol object is an exotic object that may be used as a property key. Symbol exotic objects are unique in that they are always immutable and never observably reference any other object.
Exotic String objects have the a single internal data properties named [[Private]] that is set when the object is created and never modified.
Exotic Symbol objects provide alternative definitions for all of the essential internal methods.
8.4.4.1 [[GetInheritance]] ( )
When the [[GetInheritance]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.2 [[SetInheritance]] (V)
When the [[SetInheritance]] internal method of an exotic Symbol object O is called with argument V the following steps are taken:
8.4.4.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of an exotic Symbol object an exotic Symbol object O is called the following steps are taken:
8.4.4.5 [[HasOwnProperty]] (P)
When the [[HasOwnProperty]] internal method of an exotic Symbol object O is called with property key P, the following steps are taken:
8.4,4.6 [[GetOwnProperty]] (P)
When the [[GetOwnProperty]] internal method of an exotic Symbol object O is called with property key P, the following steps are taken:
8.4.4.7 [[GetP]] (P, Receiver)
When the [[GetP]] internal method of an exotic Symbol object O is called with property key P and ECMAScipt language value Receiver the following steps are taken:
8.4.4.8 [[SetP] ( P, V, Receiver)
When the [[SetP]] internal method of an exotic Symbol object O is called with property key P, value V, and ECMAScipt language value Receiver, the following steps are taken:
8.4.4.9 [[Delete]] (P)
When the [[Delete]] internal method of an exotic Symbol object O is called with property key P the following steps are taken:
8.4.4.10 [[DefineOwnProperty]] (P, Desc)
When the [[DefineOwnProperty]] internal method of an exotic Symbol object O is called with property key P and property descriptor Desc, the following steps are taken:
8.4.4.11 [[Enumerate]] ()
When the [[Enumerate]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.12 [[Keys]] ( )
When the [[Keys]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.13 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.14 [[Freeze]] ( )
When the [[Freeze]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.15 [[Seal]] ( )
When the [[Seal]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.16 [[IsFrozen]] ( )
When the [[IsFrozen]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.4.17 [[IsSealed]] ( )
When the [[IsSealed]] internal method of an exotic Symbol object O is called the following steps are taken:
8.4.5 Exotic Arguments Objects
An arguments object is an exotic object whose array index properties map to the formal parameters of a non-strict function invocation.
Exotic arguments objects have the same internal data properties as ordinary objects. They also have a [[ParsmeterMap]] internal data property and a [[BuiltinBrand]] internal data property whose value is BuiltinArguments.
Exotic arguments objects provide alternative definitions for the following internal methods. All of the other exotic arguments object essential internal methods that are not defined below are as specified in 8.3.
8.4.5 Typed Array Exotic Objects
8.4.6 Built-in Function Objects
The function objects specified in Clause 15 may be implemented as either ordinary function objects whose behaviour is provided using ECMAScript code or as implementation provided exotic function objects whose behaviour is provide in some other manner. In either case, the effect of calling such functions must be that specified for each one in Clause 15.
If an implementation provided exotic object is used, the objects must have non-function the ordinary object behaviour specified in 8.3 except for [[GetP]] and [[GetOwnProperty]] which must be as specified in 8.3.19. All such exotic function objects also have [[Prototype]] and [[Extensible]] internal data properties and a [[BuiltinBrand]] internal data property whose value is BuiltinFunction.
[[Calll]] and [[Construct]]
8.5 Proxy Object Internal Methods and Internal Data Properties
A proxy object is an exotic object whose essential internal methods are partially implemented using ECMAScript code. Every proxy objects has an internal data property called [[ProxyHandler]]. The value of [[ProxyHandler]] is always an object, called the proxy’s handler object. Methods of a handler object may be used to augment the implementation for one or more of the proxy object’s internal methods. Every proxy object also has an internal data property called [[ProxyTarget]] whose value is usually an object. This object is called the proxy’s target object.
When a handler method is called to provide the implementation of a proxy object internal method, the handler method is passed the proxy’s target object as a parameter. A proxy’s handler object does not necessarily have a method corresponding to every essential internal method. Invoking an internal method on the proxy results in the invocation of the corresponding internal method on the proxy’s target object is the handler object does not have a method corresponding to the internal trap.
The [[ProxyHandler]] and [[ProxyTarget]] internal data properties of a proxy object are always initialized when the object is created and typically may not be modified. Some proxy objects are created in a manner that permits them to be subsequent revoked. When a proxy is revoked, its [[ProxyHander]] internal data property is set to a special revoked proxy handler object and its [[ProxyTarget]] internal data property is set to null.
Because proxy permit arbitrary ECMAScript code to be used to in the implementation of internal methods, it is possible to define a proxy object that violates the invariants defined in 8.1.6.2. An ECMAScript implementation must be robust in the presence of such violations. Some of the internal method invariants defined in 8.1.6.2 are essential integrity invariants. These invariants are explicitly enforced by the proxy internal methods specified in this section.
In the following algorithm descriptions, assume O is an ECMAScript proxy object, P is a property key value, V is any ECMAScript language value, Desc is a Property Description record, and B is a Boolean flag.
8.5.1 [[GetInheritance]] ( )
When the [[GetInheritance]] internal method of proxy object O is called the following steps are taken:
NOTE [[GetInheritance] for proxy objects enforces the following invariant:
8.5.2 [[SetInheritance]] (V)
When the [[SetInheritance]] internal method of proxy object O is called with argument V the following steps are taken:
NOTE [[SetInheritance] for proxy objects enforces the following invariant:
8.5.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of proxy object O is called the following steps are taken:
NOTE [[IsExtensible] for proxy objects enforces the following invariant:
8.5.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of proxy object O is the following steps are taken:
NOTE [[PreventExtensions] for proxy objects enforces the following invariant:
8.5.5 [[HasOwnProperty]] (P)
When the [[HasOwnProperty]] internal method of proxy object O is called with property key P, the following steps are taken:
NOTE [[HasOwnProerty] for proxy objects enforces the following invariants:
8.5.6 [[GetOwnProperty]] (P)
When the [[GetOwnProperty]] internal method of proxy object O is called with property key P, the following steps are taken:
NOTE [[GetOwnProerty] for proxy objects enforces the following invariants:
8.5.7 [[GetP]] (P, Receiver)
When the [[GetP]] internal method of proxy object O is called with property key P and ECMAScipt language value Receiver the following steps are taken:
NOTE [[GetP] for proxy objects enforces the following invariants:
8.5.8 [[SetP] ( P, V, Receiver)
When the [[SetP]] internal method of proxy object O is called with property key P, value V, and ECMAScipt language value Receiver, the following steps are taken:
NOTE [[SetP] for proxy objects enforces the following invariants:
8.5.9 [[Delete]] (P)
When the [[Delete]] internal method of proxy object O is called with property name P the following steps are taken:
NOTE [[Delete]] for proxy objects enforces the following invariant:
8.5.10 [[DefineOwnProperty]] (P, Desc)
When the [[DefineOwnProperty]] internal method of proxy object O is called with property key P and property descriptor Desc, the following steps are taken:
NOTE [[GetOwnProerty] for proxy objects enforces the following invariants:
8.5.11 [[Enumerate]] ()
When the [[Enumerate]] internal method of of proxy object O is called the following steps are taken:
NOTE [[Enumerate] for proxy objects enforces the following invariants:
8.5.12 [[Keys]] ( )
When the [[Keys]] internal method of proxy object O is called the following steps are taken:
NOTE [[Keys] for proxy objects enforces the following invariants:
8.5.13 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of proxy object O is called the following steps are taken:
NOTE [[OwnPropertyKeys] for proxy objects enforces the following invariants:
8.5.14 [[Freeze]] ( )
When the [[Freeze]] internal method of of proxy object O is called the following steps are taken:
8.5.15 [[Seal]] ( )
When the [[Seal]] internal method of O is called the following steps are taken:
8.5.16 [[IsFrozen]] ( )
When the [[IsFrozen]] internal method of O is called the following steps are taken:
8.5.17 [[IsSealed]] ( )
When the [[IsSealed]] internal method of O is called the following steps are taken:
9 Abstract Operations
These operations are not a part of the ECMAScript language; they are defined here to solely to aid the specification of the semantics of the ECMAScript Language. Other, more specialized abstract operations are defined throughout this specification.
9.1 Type Conversion and Testing
The ECMAScript language implicitly performs automatic type conversion as needed. To clarify the semantics of certain constructs it is useful to define a set of conversion abstract operations.. The conversion abstract operations are polymorphic; that is, they can accept a value of any ECMAScript language type, but not of specification types.
9.1 .1 ToPrimitive
The abstract operation ToPrimitive takes an input argument and an optional argument PreferredType. The abstract operation ToPrimitive converts its input argument to a non-Object type. If an object is capable of converting to more than one primitive type, it may use the optional hint PreferredType to favour that type. Conversion occurs according to Table 13:
Table 13 — ToPrimitive Conversions
|
Input Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return ToPrimitive(argument.[[value]]) also passing the optional hint PreferredType. |
|
Undefined |
Return argument (no conversion). |
|
Null |
Return argument (no conversion). |
|
Boolean |
Return argument (no conversion). |
|
Number |
Return argument (no conversion). |
|
String |
Return argument (no conversion). |
|
Object |
Perform the steps given following this table. |
When the InputType is Object, the following steps are taken:
When the OrdinaryToPrimitive is called with arguments O and hint, the following steps are taken:
NOTE When ToPrimitive is called with no hint, then it generally behaves as if the hint were Number. However, objects may over-ride this behaviour by defining a @@ToPrimitve method. Of the objects defined in this specification only Date objects (see 15.9.6) over-ride the default ToPrimitive behaviour. Date objects treat no hint as if the hint were String.
9.1.2 ToBoolean
The abstract operation ToBoolean converts its argument to a value of type Boolean according to Table 14:
Table 14 — ToBoolean Conversions
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return the argument. Otherwise return ToBoolean(argument.[[value]]) |
|
Undefined |
Return false |
|
Null |
Return false |
|
Boolean |
Return the input argument (no conversion). |
|
Number |
Return false if the argument is +0, −0, or NaN; otherwise return true. |
|
String |
Return false if the argument is the empty String (its length is zero); otherwise return true. |
|
Object |
Return true |
9.1.3 ToNumber
The abstract operation ToNumber converts its argument to a value of type Number according to Table 15:
Table 15 — ToNumber Conversions
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return ToNumber(argument.[[value]]) |
|
Undefined |
Return NaN |
|
Null |
Return +0 |
|
Boolean |
Return 1 if argument is true. Return +0 if argument is false. |
|
Number |
Return argument (no conversion). |
|
String |
See grammar and note below. |
|
Object |
Apply the following steps:
|
9.1.3.1 ToNumber Applied to the String Type
ToNumber applied to Strings applies the following grammar to the input String. If the grammar cannot interpret the String as an expansion of StringNumericLiteral, then the result of ToNumber is NaN.
Syntax
StringNumericLiteral :::
StrWhiteSpaceopt
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
HexIntegerLiteral
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalDigits ExponentPartopt
DecimalDigits :::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit ::: one of
0 1 2 3 4 5 6 7 8 9
ExponentPart :::
ExponentIndicator SignedInteger
ExponentIndicator ::: one of
e E
SignedInteger :::
DecimalDigits
+
DecimalDigits
- DecimalDigits
HexIntegerLiteral :::
0x
HexDigit
0X HexDigit
HexIntegerLiteral
HexDigit
HexDigit ::: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
NOTE Some differences should be noted between the syntax of a StringNumericLiteral and a NumericLiteral (see 7.8.3):
Runtime Semantics
The conversion of a String to a Number value is similar overall to the determination of the Number value for a numeric literal (see 7.8.3), but some of the details are different, so the process for converting a String numeric literal to a value of Number type is given here in full. This value is determined in two steps: first, a mathematical value (MV) is derived from the String numeric literal; second, this mathematical value is rounded as described below.
Once the exact MV for a String numeric literal has been determined, it is then rounded to a value of the Number type. If the MV is 0, then the rounded value is +0 unless the first non white space character in the String numeric literal is ‘-’, in which case the rounded value is −0. Otherwise, the rounded value must be the Number value for the MV (in the sense defined in 8.5), unless the literal includes a StrUnsignedDecimalLiteral and the literal has more than 20 significant digits, in which case the Number value may be either the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit or the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit and then incrementing the literal at the 20th digit position. A digit is significant if it is not part of an ExponentPart and
9.1.4 ToInteger
The abstract operation ToInteger converts its argument to an integral numeric value. This abstract operation functions as follows:
9.1.5 ToInt32: (Signed 32 Bit Integer)
The abstract operation ToInt32 converts its argument to one of 232 integer values in the range −231 through 231−1, inclusive. This abstract operation functions as follows:
NOTE Given the above definition of ToInt32:
9.1.6 ToUint32: (Unsigned 32 Bit Integer)
The abstract operation ToUint32 converts its argument to one of 232 integer values in the range 0 through 232−1, inclusive. This abstract operation functions as follows:
NOTE Given the above definition of ToUInt32:
9.1.7 ToUint16: (Unsigned 16 Bit Integer)
The abstract operation ToUint16 converts its argument to one of 216 integer values in the range 0 through 216−1, inclusive. This abstract operation functions as follows:
NOTE Given the above definition of ToUint16:
9.1.8 ToString
The abstract operation ToString converts its argument to a value of type String according to Table 16:
Table 16 — ToString Conversions
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return ToString(argument.[[value]]) |
|
Undefined |
"undefined" |
|
Null |
"null" |
|
Boolean |
If argument is true, then return "true". If argument is false, then return "false". |
|
Number |
See 9.8.1. |
|
String |
Return argument (no conversion) |
|
Object |
Apply the following steps: 1. Let primValue be ToPrimitive(argument, hint String). 2. Return ToString(primValue). |
9.1.8.1 ToString Applied to the Number Type
The abstract operation ToString converts a Number m to String format as follows:
NOTE 1 The following observations may be useful as guidelines for implementations, but are not part of the normative requirements of this Standard:
NOTE 2 For implementations that provide more accurate conversions than required by the rules above, it is recommended that the following alternative version of step 5 be used as a guideline:
Otherwise, let n, k, and s be integers such that k ≥ 1, 10k−1 ≤ s < 10k, the Number value for s × 10n−k is m, and k is as small as possible. If there are multiple possibilities for s, choose the value of s for which s × 10n−k is closest in value to m. If there are two such possible values of s, choose the one that is even. Note that k is the number of digits in the decimal representation of s and that s is not divisible by 10.
NOTE 3 Implementers of ECMAScript may find useful the paper and code written by David M. Gay for binary-to-decimal conversion of floating-point numbers:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary
Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). November 30, 1990.
Available as
http://cm.bell-labs.com/cm/cs/doc/90/4-10.ps.gz. Associated code available
as
http://cm.bell-labs.com/netlib/fp/dtoa.c.gz and as
http://cm.bell-labs.com/netlib/fp/g_fmt.c.gz and may also be found at the various netlib mirror sites.
9.1.9 ToObject
The abstract operation ToObject converts its argument to a value of type Object according to Table 17:
Table 17 — ToObject Conversions
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return ToObject(argument.[[value]]) |
|
Undefined |
Throw a TypeError exception. |
|
Null |
Throw a TypeError exception. |
|
Boolean |
Return a new Boolean object whose [[BooleanData]] internal data property is set to the value of argument. See 15.6 for a description of Boolean objects. |
|
Number |
Return a new Number object whose [[NumberData]] internal data property is set to the value of argument. See 15.7 for a description of Number objects. |
|
String |
Return a new String object whose [[StringData]] internal data property is set to the value of argument. See 15.5 for a description of String objects. |
|
Object |
Return argument (no conversion). |
9.1.10 ToPropertyKey
The abstract operation ToPropertyKey converts its argument to a value that can be used as a property key by performing the following steps:
9.2 Testing and Comparison Operations
9.2.1 CheckObjectCoercible
The abstract operation CheckObjectCoercible throws an error if its argument is a value that cannot be converted to an Object using ToObject. It is defined by Table 18:
Table 18 — CheckObjectCoercible Results
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return CheckObjectCoercible(argument.[[value]]) |
|
Undefined |
Throw a TypeError exception. |
|
Null |
Throw a TypeError exception. |
|
Boolean |
Return argument |
|
Number |
Return argument |
|
String |
Return argument |
|
Object |
Return argument |
9.2.2 IsCallable
The abstract operation IsCallable determines if its argument, which must be an ECMAScript language value or a Completion Record, is a callable function Object according to Table 19:
Table 19 — IsCallable Results
|
Argument Type |
Result |
|
Completion Record |
If argument is an abrupt completion, return argument. Otherwise return IsCallable(argument.[[value]]) |
|
Undefined |
Return false. |
|
Null |
Return false. |
|
Boolean |
Return false. |
|
Number |
Return false. |
|
String |
Return false. |
|
Object |
If argument has a [[Call]] internal method, then return true, otherwise return false. |
9.2.3 The SameValue Algorithm
The internal comparison abstract operation SameValue(x, y), where x and y are ECMAScript language values, produces true or false. Such a comparison is performed as follows:
9.2.4 IsConstructor
The abstract operation IsConstructor determines if its argument, which must be an ECMAScript language value or a Completion Record, is a function object with a [[Construct]] internal method.
9.3 Operations on Objects
9.3.1 Get (O, P)
The abstract operation Get is used to retrieve the value of an specific property of an object. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs, the following steps:
9.3.2 Put (O, P, V, Throw)
The abstract operation Put is used to set the value of an specific property of an object. The operation is called with arguments O, P, V, and Throw where O is the object, P is the property key, V is the new value for the property and Throw is a Boolean flag. This abstract operation performs, the following steps:
9.3.3 CreateOwnDataProperty (O, P, V)
The abstract operation CreateOwnProperty is used to create a new own property of an object. The operation is called with arguments O, P, and V where O is the object, P is the property key, and V is the new value for the property. This abstract operation performs, the following steps:
9.3.4 DefinePropertyOrThrow (O, P, desc)
The abstract operation DefinePropertyOrThrow is used to call the [[DefineOwnProperlty]] internal method of an object in a manner that will throw a TypeError exception if the requested property update can not be performed. The operation is called with arguments O, P, and desc where O is the object, P is the property key, and desc is Property Descriptor record for the property. This abstract operation performs, the following steps:
9.3.5 DeletePropertyOrThrow (O, P)
The abstract operation Put is used to remove a specific own property of an object. It throws an exception is the property is not configurable. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs, the following steps:
9.3.6 HasProperty (O, P)
The abstract operation HasProperty is used to determine whether an object has a property with the specified property key. The property may be either an own or inherited. A Boolean value is return. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs, the following steps:
9.3.7 GetMethod (O, P)
The abstract operation GetMethod is used to get the value of an specific property of an object when the value of the property is expected to be a function. The operation is called with arguments O and P where O is the object, P is the property key. This abstract operation performs, the following steps:
9.3.8 Invoke(O,P [,args])
The abstract operation Invoke is used to call a method property of an object. The operation is called with arguments P, O, and optionally args where P is the property key, O serves as both the lookup point for the property and the this value of the call, and args is the list of arguments values passed to the method. If args is not present, an empty List is used as its value. This abstract operation performs, the following steps:
9.3.9 MakeObjectSecure (O, immutable)
The abstract operation MakeObjectSecure is used to fix the set of own properties of an object. If the Boolean argument immutable is true all own data properties are also made non-writable. This abstract operation performs, the following steps:
9.3.10 TestIfSecureObject (O, immutable)
The abstract operation TestIfSecureObject is used to determine the set of own properties of an object are fixed. If the Boolean argument immutable is true a check is also made to determine whether all own data properties are non-writable. This abstract operation performs, the following steps:
9.3.11 CreateArrayFromList (elements)
The abstract operation CreateArrayFromList is used to create an Array object whose elements are provided by an internal List. This abstract operation performs, the following steps:
9.3.12 OrdinaryHasInstance (C, O)
The abstract operation OrdinaryHasInstance implements the default algorithm for determining if an object O inherits from the inheritance path used by constructor C. This abstract operation performs, the following steps:
10 Executable Code and Execution Contexts
10.1 Types of Executable Code
There are three types of ECMAScript executable code:
NOTE Function code is generally provided as the bodies of Function Definitions (13.1), Arrow Function Definditions (13.2), Method Definitions (13.3) and Generator Definitions (13.4). Function code is also derived from the last argument to the Function constructor (15.3). Generator code is provided as the bodies of Generator Definitions 13.4 and Generator Expressions (11.????).
10.1.1 Strict Mode Code
An ECMAScript Script syntactic unit may be processed using either unrestricted or strict mode syntax and semantics. When processed using strict mode the three types of ECMAScript code are referred to as strict global code, strict eval code, and strict function code. Code is interpreted as strict mode code in the following situations:
10.1.2 Non-ECMAScript Functions
An ECMAScript implementation may support the evaluation of function objects whose evaluative behaviour is expressed in some implementation defined form of executable code other than via ECMAScript code. Whether a function object is an ECMAScript code function or a non-ECMAScript function is not semantically observable from the perspective of an ECMAScript code function that calls or is called by such a non-ECMAScript function.
10.2 Lexical Environments
A Lexical Environment is a specification type used to define the association of Identifiers to specific variables and functions based upon the lexical nesting structure of ECMAScript code. A Lexical Environment consists of an Environment Record and a possibly null reference to an outer Lexical Environment. Usually a Lexical Environment is associated with some specific syntactic structure of ECMAScript code such as a FunctionDeclaration, a BlockStatement, or a Catch clause of a TryStatement and a new Lexical Environment is created each time such code is evaluated.
An Environment Record records the identifier bindings that are created within the scope of its associated Lexical Environment.
The outer environment reference is used to model the logical nesting of Lexical Environment values. The outer reference of a (inner) Lexical Environment is a reference to the Lexical Environment that logically surrounds the inner Lexical Environment. An outer Lexical Environment may, of course, have its own outer Lexical Environment. A Lexical Environment may serve as the outer environment for multiple inner Lexical Environments. For example, if a FunctionDeclaration contains two nested FunctionDeclarations then the Lexical Environments of each of the nested functions will have as their outer Lexical Environment the Lexical Environment of the current evaluation of the surrounding function.
A global environment is a Lexical Environment which does not have an outer environment. The global environment’s outer environment reference is null. A global environment’s environment record may be prepopulated with identifier bindings and includes an associated global object whose properties provide some of the global environment’s identifier bindings. This global object is the value of a global environment’s this binding. As ECMAScript code is executed, additional properties may be added to the global object and the initial properties may be modified.
A method environment is a Lexical Environment that corresponds to the invocation of an ECMAScript function object that establishes a new this binding. A method environment also captures the state necessary to support super method invocations.
Lexical Environments and Environment Record values are purely specification mechanisms and need not correspond to any specific artefact of an ECMAScript implementation. It is impossible for an ECMAScript program to directly access or manipulate such values.
10.2.1 Environment Records
There are two primary kinds of Environment Record values used in this specification: declarative environment records and object environment records. Declarative environment records are used to define the effect of ECMAScript language syntactic elements such as FunctionDeclarations, VariableDeclarations, and Catch clauses that directly associate identifier bindings with ECMAScript language values. Object environment records are used to define the effect of ECMAScript elements such as WithStatement that associate identifier bindings with the properties of some object. Global Environment Records and Function Environment Records are specializations that are used for specifically for Script global declarations and for top-level declarations within funtions.
For specification purposes Environment Record values can be thought of as existing in a simple object-oriented hierarchy where Environment Record is an abstract class with three concrete subclasses, declarative environment record, object environment record, and global environment record. Function environment records are a subclass of declarative environment record. The abstract class includes the abstract specification methods defined in Table 20. These abstract methods have distinct concrete algorithms for each of the concrete subclasses.
Table 20 — Abstract Methods of Environment Records
|
Method |
Purpose |
|
HasBinding(N) |
Determine if an environment record has a binding for an identifier. Return true if it does and false if it does not. The String value N is the text of the identifier. |
|
CreateMutableBinding(N, D) |
Create a new but uninitialised mutable binding in an environment record. The String value N is the text of the bound name. If the optional Boolean argument D is true the binding is may be subsequently deleted. |
|
CreateImmutableBinding(N) |
Create a new but uninitialised immutable binding in an environment record. The String value N is the text of the bound name. |
|
InitializeBinding(N,V) |
Set the value of an already existing but uninitialised binding in an environment record. The String value N is the text of the bound name. V is the value for the binding and is a value of any ECMAScript language type. |
|
SetMutableBinding(N,V, S) |
Set the value of an already existing mutable binding in an environment record. The String value N is the text of the bound name. V is the value for the binding and may be a value of any ECMAScript language type. S is a Boolean flag. If S is true and the binding cannot be set throw a TypeError exception. S is used to identify strict mode references. |
|
GetBindingValue(N,S) |
Returns the value of an already existing binding from an environment record. The String value N is the text of the bound name. S is used to identify strict mode references. If S is true and the binding does not exist or is uninitialised throw a ReferenceError exception. |
|
DeleteBinding(N) |
Delete a binding from an environment record. The String value N is the text of the bound name If a binding for N exists, remove the binding and return true. If the binding exists but cannot be removed return false. If the binding does not exist return true. |
|
HasThisBinding() |
Determine if an environment record establishes a this binding. Return true if it does and false if it does not. |
|
HasSuperBinding() |
Determine if an environment record establishes a super method binding. Return true if it does and false if it does not. |
|
WithBaseObject () |
If this environment record is associated with a with statement, return the with object. Otherwise, return undefined. |
10.2.1.1 Declarative Environment Records
Each declarative environment record is associated with an ECMAScript program scope containing variable, constant, let, class, module, import, and/or function declarations. A declarative environment record binds the set of identifiers defined by the declarations contained within its scope.
The behaviour of the concrete specification methods for Declarative Environment Records is defined by the following algorithms.
10.2.1.1.1 HasBinding(N)
The concrete environment record method HasBinding for declarative environment records simply determines if the argument identifier is one of the identifiers bound by the record:
10.2.1.1.2 CreateMutableBinding (N, D)
The concrete Environment Record method CreateMutableBinding for declarative environment records creates a new mutable binding for the name N that is uninitialised. A binding must not already exist in this Environment Record for N. If Boolean argument D is provided and has the value true the new binding is marked as being subject to deletion.
10.2.1.1.3 CreateImmutableBinding (N)
The concrete Environment Record method CreateImmutableBinding for declarative environment records creates a new immutable binding for the name N that is uninitialised. A binding must not already exist in this environment record for N.
10.2.1.1.4 InitializeBinding (N,V)
The concrete Environment Record method InitializeBinding for declarative environment records is used to set the bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. An uninitialised binding for N must already exist.
10.2.1.1.5 SetMutableBinding (N,V,S)
The concrete Environment Record method SetMutableBinding for declarative environment records attempts to change the bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. A binding for N must already exist. If the binding is an immutable binding, a TypeError is thrown if S is true.
10.2.1.1.6 GetBindingValue(N,S)
The concrete Environment Record method GetBindingValue for declarative environment records simply returns the value of its bound identifier whose name is the value of the argument N. The binding must already exist. If S is true and the binding is an uninitialised immutable binding throw a ReferenceError exception.
10.2.1.1.7 DeleteBinding (N)
The concrete Environment Record method DeleteBinding for declarative environment records can only delete bindings that have been explicitly designated as being subject to deletion.
10.2.1.1.8 HasThisBinding ()
Regular Declarative Environment Records do not provide a this binding.
10.2.1.1.9 HasSuperBinding ()
Regular Declarative Environment Records do not provide a super binding.
10.2.1.1.10 WithBaseObject()
Declarative Environment Records always return undefined as their WithBaseObject.
10.2.1.2 Object Environment Records
Each object environment record is associated with an object called its binding object. An object environment record binds the set of identifier names that directly correspond to the property names of its binding object. Property names that are not an IdentifierName are not included in the set of bound identifiers. Both own and inherited properties are included in the set regardless of the setting of their [[Enumerable]] attribute. Because properties can be dynamically added and deleted from objects, the set of identifiers bound by an object environment record may potentially change as a side-effect of any operation that adds or deletes properties. Any bindings that are created as a result of such a side-effect are considered to be a mutable binding even if the Writable attribute of the corresponding property has the value false. Immutable bindings do not exist for object environment records.
Object environment records created for with statements (12.10) can provide their binding object as an implicit this value for use in function calls. The capability is controlled by a withEnvironment Boolean value that is associated with each object environment record. By default, the value of withEnvironment is false for any object environment record.
The behaviour of the concrete specification methods for Object Environment Records is defined by the following algorithms.
10.2.1.2.1 HasBinding(N)
The concrete Environment Record method HasBinding for object environment records determines if its associated binding object has a property whose name is the value of the argument N:
10.2.1.2.2 CreateMutableBinding (N, D)
The concrete Environment Record method CreateMutableBinding for object environment records creates in an environment record’s associated binding object a property whose name is the String value and initialises it to the value undefined. A property named N must not already exist in the binding object. If Boolean argument D is provided and has the value true the new property’s [[Configurable]] attribute is set to true, otherwise it is set to false.
10.2.1.2.3 CreateImmutableBinding (N)
The concrete Environment Record method CreateImmutableBinding is never used within this specification in association with Object environment records.
10.2.1.2.4 InitializeBinding (N,V)
The concrete Environment Record method InitializeBinding for object environment records is used to set the bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. An uninitialised binding for N must already exist.
10.2.1.2.5 SetMutableBinding (N,V,S)
The concrete Environment Record method SetMutableBinding for object environment records attempts to set the value of the environment record’s associated binding object’s property whose name is the value of the argument N to the value of argument V. A property named N normally already exists but if it does not or is not currently writable, error handling is determined by the value of the Boolean argument S.
10.2.1.2.6 GetBindingValue(N,S)
The concrete Environment Record method GetBindingValue for object environment records returns the value of its associated binding object’s property whose name is the String value of the argument identifier N. The property should already exist but if it does not the result depends upon the value of the S argument:
10.2.1.2.7 DeleteBinding (N)
The concrete Environment Record method DeleteBinding for object environment records can only delete bindings that correspond to properties of the environment object whose [[Configurable]] attribute have the value true.
10.2.1.2.8 HasThisBinding ()
Regular Object Environment Records do not provide a this binding.
10.2.1.2.9 HasSuperBinding ()
Regular Object Environment Records do not provide a super binding.
10.2.1.2.10 WithBaseObject()
Object Environment Records return undefined as their WithBaseObject unless their withEnvironment flag is true.
10.2.1.3 Function Environment Records
A function environment record is a declarative environment record that is used to represent the outer most scope of a function that provides a this binding. In addition to its identifier bindings, a function environment record contains the this value used within its scope. If such a function references super, its function environment record also contains the state that is used to perform super method invocations from within the function.
Function environment records store their this binding as the value of their thisValue. If the associated function references super, the environment record stores in HomeObject the object that the function is bound to as a method and in MethodName the property key used for unqualified super invocations from within the function. The default value for HomeObject and MethodName is undefined.
Methods environment records support all of Declarative Environment Record methods listed in Table 20 and share the same specifications for all of those methods except for HasThisBinding and HasSuperBinding. In addition, declarative environment records support the methods listed in Table 21:
Table 21 — Additional Methods of Function Environment Records
|
Method |
Purpose |
|
GetThisBinding() |
Return the value of this environment record’s this binding. |
|
GetSuperBase() |
Return the object that is the base for super property accesses bound in this environment record. The object is derived from this environment record’s HomeObject binding. If the value is Empty, return undefined. |
|
GetMethodName() |
Return the value of this environment record’s MethodName binding. |
The behaviour of the additional concrete specification methods for Function Environment Records is defined by the following algorithms:
10.2.1.3.1 HasThisBinding ()
Function Environment Records always provide a this binding.
10.2.1.3.2 HasSuperBinding ()
10.2.1.3.3 GetThisBinding ()
10.2.1.3.4 GetSuperBase ()
10.2.1.3.5 GetMethodName ()
10.2.1.4 Global Environment Records
A global environment record is used to represent the outer most scope that is shared by all of the ECMAScript Script elements that are processed in a common Realm (10.3). A global environment provides the bindings for built-in globals (15.1), properties of the global object, and for all declarations that are not function code and that occur within Script productions.
A global environment record is logically a single record but it is specified as a composite encapsulating an object environment record and a declarative environment record. The object environment record has as its base object the global object of the associated Realm. This global object is also the value of the global environment record’s thisValue. The object environment record component of a global environment record contains the bindings for all built-in globals (15.1) and all bindings introduced by a FunctionDeclaration or VariableStatement contained in global code. The bindings for all other ECMAScript declarations in global code are contained in the declarative environment record component of the global environment record.
Properties may be created directly on a global object. Hence, the object environment record component of a global environment record may contain both bindings created explicitly by FunctionDeclaration or VariableStatement declarations and binding created implicitly as properties of the global object. In order to identify which bindings were explicitly created using declarations, a global environment record maintains a list of the names bound using its CreateGlobalVarBindings and CreateGlobalFunctionBindings concrete methods.
Global environment records have the additional state components listed in Table 22 and the additional methods listed in Table 23.
Table 22 -- Components of Global Environment Records
|
Component |
Purpose |
|
ObjectEnvirornment |
A Object Environment Record whose base object is the global object. Contains global built-in bindings as well as bindings for FunctionDeclaration or VariableStatement declarations in global code for the associated Realm. |
|
DeclarativeEnvironment |
A Declarative Environment Record that contains bindings for all declarations in global for the associated Realm code except for FunctionDeclaration and VariableStatement declarations. |
|
VarNames |
A List containing the string names bound by FunctionDeclaration or VariableStatement declarations in global code for the associated Realm. |
Table 23 — Additional Methods of Global Environment Records
|
Method |
Purpose |
|
GetThisBinding() |
Return the value of this environment record’s this binding. |
|
HasVarDeclaration (N) |
Determines if the argument identifier has a binding in this environment record that was created using a VariableStatement or a FunctionDeclaration. |
|
HasLexicalDeclaration (N) |
Determines if the argument identifier has a binding in this environment record that was created using a lexical declaration such as a LexicalDeclaration or a ClassDeclaration: |
|
CanDeclareGlobalVar (N) |
Determines if a corresponding CreateGlobalVarBinding call would succeed if called for the same argument N. |
|
CanDeclareGlobalFunction (N) |
Determines if a corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument N. |
|
CreateGlobalVarBinding(N, D) |
Used to create global var bindings in the ObjectEnvironmentComponent of the environment record. The binding will be a mutable binding. The corresponding global object property will have attribute values approate for a var. The String value N is the text of the bound name. V is the initial value of the binding If the optional Boolean argument D is true the binding is may be subsequently deleted. This is logically equivalent to CreateMutableBinding but it allows var declarations to receive special treatment. |
|
CreateGlobalFunctionBinding(N, V, D) |
Used to create and initialize global function bindings in the ObjectEnvironmentComponent of the environment record. The binding will be a mutable binding. The corresponding global object property will have attribute values approate for a function.The String value N is the text of the bound name. If the optional Boolean argument D is true the binding is may be subsequently deleted. This is logically equivalent to CreateMutableBinding followed by a SetMutableBinding but it allows function declarations to receive special treatment. |
The behaviour of the concrete specification methods for Global Environment Records is defined by the following algorithms.
10.2.1.4.1 HasBinding(N)
The concrete environment record method HasBinding for global environment records simply determines if the argument identifier is one of the identifiers bound by the record:
10.2.1.4.2 CreateMutableBinding (N, D)
The concrete environment record method CreateMutableBinding for global environment records creates a new mutable binding for the name N that is uninitialised. The binding is created in the associated DeclarativeEnvironment. A binding for N must not already exist in the DeclarativeEnvironment. If Boolean argument D is provided and has the value true the new binding is marked as being subject to deletion.
10.2.1.4.3 CreateImmutableBinding (N)
The concrete Environment Record method CreateImmutableBinding for declarative environment records creates a new immutable binding for the name N that is uninitialised. A binding must not already exist in this environment record for N.
10.2.1.4.4 InitializeBinding (N,V)
The concrete Environment Record method InitializeBinding for global environment records is used to set the bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. An uninitialised binding for N must already exist.
10.2.1.4.5 SetMutableBinding (N,V,S)
The concrete Environment Record method SetMutableBinding for global environment records attempts to change the bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. If the binding is an immutable binding, a TypeError is thrown if S is true. A property named N normally already exists but if it does not or is not currently writable, error handling is determined by the value of the Boolean argument S.
10.2.1.4.6 GetBindingValue(N,S)
The concrete Environment Record method GetBindingValue for global environment records simply returns the value of its bound identifier whose name is the value of the argument N. If S is true and the binding is an uninitialised binding throw a ReferenceError exception. A property named N normally already exists but if it does not or is not currently writable, error handling is determined by the value of the Boolean argument S.
10.2.1.4.7 DeleteBinding (N)
The concrete Environment Record method DeleteBinding for global environment records can only delete bindings that have been explicitly designated as being subject to deletion.
10.2.1.4.8 HasThisBinding ()
Global Environment Records always provide a this binding whose value is the associated global object.
10.2.1.4.9 HasSuperBinding ()
10.2.1.4.10 WithBaseObject()
Global Environment Records always return undefined as their WithBaseObject.
10.2.1.4.11 GetThisBinding ()
10.2.1.4.12 HasVarDeclaration (N)
The concrete environment record method HasVarDeclaration for global environment records determines if the argument identifier has a binding in this record that was created using a VariableStatement or a FunctionDeclaration:
10.2.1.4.13 HasLexicalDeclaration (N)
The concrete environment record method HasLexicalDeclaration for global environment records determines if the argument identifier has a binding in this record that was created using a lexical declaration such as a LexicalDeclaration or a ClassDeclaration:
10.2.1.4.14 CanDeclareGlobalVar (N)
The concrete environment record method CanDeclareGlobalVar for global environment records determines if a corresponding CreateGlobalVarBinding call would succeed if called for the same argument N. Redundent var declarations and var declarations for pre-existing global object properties are allowed.
10.2.1.4.15 CanDeclareGlobalFunction (N)
The concrete environment record method CanDeclareGlobalVar for global environment records determines if a corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument N.
10.2.1.4.16 CreateGlobalVarBinding (N, D)
The concrete Environment Record method CreateVarBinding for global environment records creates a mutable binding in the associated object environment record and records the bound name in the associated VarNames List. If a binding already exists, it is reused.
10.2.1.4.17 CreateGlobalFunctionBinding (N, V, D)
The concrete Environment Record method CreateFunctionBinding for global environment records creates a mutable binding in the associated object environment record and records the bound name in the associated VarNames List. If a binding already exists, it is replaced.
NOTE Global unction declarations are always represented as a own property of the global object. If possible, an existing own property is reconfigured to have a standard set of attribute values.
10.2.2 Lexical Environment Operations
The following abstract operations are used in this specification to operate upon lexical environments:
10.2.2.1 GetIdentifierReference (lex, name, strict)
The abstract operation GetIdentifierReference is called with a Lexical Environment lex, a String name, and a Boolean flag strict. The value of lex may be null. When called, the following steps are performed:
10.2.2.2 NewDeclarativeEnvironment (E)
When the abstract operation NewDeclarativeEnvironment is called with either a Lexical Environment or null as argument E the following steps are performed:
10.2.2.3 NewObjectEnvironment (O, E)
When the abstract operation NewObjectEnvironment is called with an Object O and a Lexical Environment E (or null) as arguments, the following steps are performed:
10.2.2.4 NewFunctionEnvironment (F, T)
When the abstract operation NewFunctionEnvironment is called with an ECMAScript function Object F and a ECMAScript value T as arguments, the following steps are performed:
10.3 Code Realms
Before it is evaluated, all ECMAScript code must be associated with a Realm. Conceptually, a realm consists as of an set of intrinsic objects, an ECMAScript global environment, all of the ECMAScript code that is loaded within the scope of that global environment, a Loader object that can associate new ECMAScript code with the realm, and other associated state and resources.
A Realm is specified as a Record with the fields specified in Table 24:
Table 24 — Realm Record Fields
|
Field Name |
Value |
Meaning |
|
[[intrinsics]] |
A record whose field names are intrinsic keys and whose values are objects |
These are the intrinsic values used by code associated with this Realm |
|
[[globalThis]] |
An ECMAScript object |
The global object for this Realm |
|
[[globalEnv]] |
A ECMAScript environment |
The global environment for this Realm |
|
[[loader]] |
any ECMAScript identifier or empty |
The Loader object that can associate ECMAScript code with this Realm |
The intrinsic objects associated with a code Realm are specified by Table 25. Within this specification a reference such as %name% means the value with this intrinsic name in the [[intinsics]] record of the Realm of the running execution context.
Table 25 — Intrinsic Objects with Realm Specific Bindings
|
Intrinsic Name |
ECMAScript Language Association |
|
%Object% |
The initial value of the global object property named "Object". |
|
%ObjectPrototype% |
The initial value of the "prototype" data property of the intrinsic %Object%. |
|
%ObjProto_toString% |
The initial value of the "toString" data property of the intrinsic %ObjectPrototype%. |
|
%Function% |
The initial value of the global object property named "Function". |
|
%FunctionPrototype% |
The initial value of the "prototype" data property of the intrinsic %Function%. |
|
%Array% |
The initial value of the global object property named "Array". |
|
%ArrayPrototype% |
The initial value of the "prototype" data property of the intrinsic %Array%. |
|
%ArrayIteratorPrototype% |
The prototype object used for |
|
%Map% |
The initial value of the global object property named "Map". |
|
%MapPrototype% |
The initial value of the "prototype" data property of the intrinsic %Map%. |
|
%MapIteratorPrototype% |
The prototype object used for |
|
%WeakMap% |
The initial value of the global object property named "WeakMap". |
|
%WeakMapPrototype% |
The initial value of the "prototype" data property of the intrinsic %WeakMap%. |
|
%Set% |
The initial value of the global object property named "Set". |
|
%SetPrototype% |
The initial value of the "prototype" data property of the intrinsic %Set%. |
|
%SetIteratorPrototype% |
The prototype object used for |
|
%StopIteration% |
|
|
??? |
10.4 Execution Contexts
An execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation. At any point in time, there is at most one execution context that is actually executing code. This is known as the running execution context. A stack is used to track execution contexts. The running execution context is always the top element of this stack. A new execution context is created whenever control is transferred from the executable code associated with the currently running execution context to executable code that is not associated with that execution context. The newly created execution context is pushed onto the stack and becomes the running execution context.
An execution context contains whatever implementation specific state is necessary to track the execution progress of its associated code. Each execution context has the state components listed in Table 26 .
Table 26 —State Components for All Execution Contexts
|
Component |
Purpose |
|
code evaluation state |
Any state needed to perform, suspend, and resume evaluation of the code associated with this execution context. |
|
Realm |
The Realm from which associated code accesses ECMAScript resources. |
Evaluation of code by the running execution context may be suspended at various points defined within this specification. Once the running execution context has been suspended a different execution context may become the running execution context and commence evaluating its code. At some latter time a suspended execution context may again become the running execution context and continue evaluating its code at the point where it had previously been suspended. Transition of the running execution context status among execution contexts usually occurs in stack-like last-in/first-out manner. However, some ECMAScript features require non-LIFO transitions of the running execution context.
Execution contexts for ECMAScript code have the additional state components listed in Table 27.
Table 27 —Additional State Components for ECMAScript Code Execution Contexts
|
Component |
Purpose |
|
LexicalEnvironment |
Identifies the Lexical Environment used to resolve identifier references made by code within this execution context. |
|
VariableEnvironment |
Identifies the Lexical Environment whose environment record holds bindings created by VariableStatements within this execution context. |
The LexicalEnvironment and VariableEnvironment components of an execution context are always Lexical Environments. When an execution context is created its LexicalEnvironment and VariableEnvironment components initially have the same value. The value of the VariableEnvironment component never changes while the value of the LexicalEnvironment component may change during execution of code within an execution context.
In most situations only the running execution context (the top of the execution context stack) is directly manipulated by algorithms within this specification. Hence when the terms “LexicalEnvironment”, and “VariableEnvironment” are used without qualification they are in reference to those components of the running execution context.
An execution context is purely a specification mechanism and need not correspond to any particular artefact of an ECMAScript implementation. It is impossible for an ECMAScript program to directly access or observe an execution context.
10.4.1 Identifier Resolution
Identifier resolution is the process of determining the binding of an IdentifierName using the LexicalEnvironment of the running execution context. During execution of ECMAScript code, Identifier Resolution is performed using the following algorithm:
The result of evaluating an identifier is always a value of type Reference with its referenced name component equal to the Identifier String.
10.4.2 GetThisEnvironment
The abstract operation GetThisEnviroment finds the lexical environment that currently supplies the binding of the keyword this. GetThisEnviroment performs the following steps:
NOTE The loop in step 4 will always terminate because the llst of environment always end with the global environment which has a this binding.
10.4.3 This Resolution
The abstract operation ThisResolution is the process of determining the binding of the keyword this using the LexicalEnvironment of the running execution context. ThisResolution performs the following steps:
10.4.4 GetGlobalObject
The abstract operation GetGlobalObject returns the global object used by the currently running execution context. GetGlobalObject Performs the following steps:
10.5 Declaration Binding Instantiation
10.5.1 Global Declaration Instantiation
NOTE When an execution context is established for evaluating scripts, declarations are instantiated in the current global environment. Each global binding declarated in the code is instantiated.
Global Declaration Instantiation is performed as follows using arguments script, env, and deletableBindings. script is the ScriptBody that for which the execution context is being established. env is the global environment record in which bindings are to be created. deletableBindings is true if the bindings that are created should be deletable.
NOTE Early errors specified in 14.1 prevent name conflicts between function/var declarations and let/const/class/module declarations as well as redeclaration of let/const/class/module bindings for declaration contained within a single Script. However, such conflicts and redeclarations that span more than one Script are detected as runtime errors during Global Declaration Instantiation. If any such errors are detected, no bindings are instantiated for the script.
Unlike explicit var or function declarations, properties that are directly created on the global object result in global bindings that may be shadowed by let, const, class, and module declarations.
10.5.2 Module Declaration Instantiation
10.5.3 Function Declaration Instantiation
This version reflects the concensus as of the Sept. 2012 TC39 meeting. However, it now appears that the binding semantics of formal parameters is like to change again.
NOTE When an execution context is established for evaluating function code a new Declarative Environment Record is created and bindings for each formal parameter, and each function level variable, constant, or function declarated in the function are instantiated in the environment record. Formal parameters and functions are initialized as part of this process. All other bindings are initialized during execution of the function code.
Function Declaration Instantiation is performed as follows using arguments func, argumentsList, and env. func is the function object that for which the execution context is being established. env is the declarative environment record in which bindings are to be created.
10.5.4 Block Declaration Instantiation
NOTE When a Block or CaseBlock production is evaluated a new Declarative Environment Record is created and bindings for each block scoped variable, constant, or function declarated in the block are instantiated in the environment record.
Block Declaration Instantiation is performed as follows using arguments code and env. code is the grammar production corresponding to the body of the block. env is the declarative environment record in which bindings are to be created.
10.5.5 Eval Declaration Instantiation
10.6 Arguments Object
When function code is evaluated, an arguments object is created unless (as specified in 10.5) the identifier arguments occurs as an Identifier in the function’s FormalParameterList or occurs as the BindingIdentifier of a FunctionDeclaration contained in the outermost StatementList of the function code.
The abstract operation InstantiateArgumentsObject called with an argument args performs the following steps:
The abstract operation CompleteStrictArgumentsObject called with argument obj which must have been previous created by the abstraction operation InstantiateArgumentsObject. The following steps are performed:
The abstract operation CompleteMappedArgumentsObject is called with object obj, object func, grammar production formals, and environment record env. obj must have been previous created by the abstraction operation InstantiateArgumentsObject.The following steps are performed:
The abstract operation MakeArgGetter called with String name and environment record env creates a function object that when executed returns the value bound for name in env. It performs the following steps:
The abstract operation MakeArgSetter called with String name and environment record env creates a function object that when executed sets the value bound for name in env. It performs the following steps:
The [[Get]] internal method of an arguments object for a non-strict mode function with formal parameters when called with a property name P performs the following steps:
The [[GetOwnProperty]] internal method of an arguments object for a non-strict mode function with formal parameters when called with a property name P performs the following steps:
The [[DefineOwnProperty]] internal method of an arguments object for a non-strict mode function with formal parameters when called with a property name P and Property Descriptor Desc performs the following steps:
The [[Delete]] internal method of an arguments object for a non-strict mode function with formal parameters when called with a property key P performs the following steps:
NOTE 1 For non-strict mode functions the array index (defined in 15.4) named data properties of an arguments object whose numeric name values are less than the number of formal parameters of the corresponding function object initially share their values with the corresponding argument bindings in the function’s execution context. This means that changing the property changes the corresponding value of the argument binding and vice-versa. This correspondence is broken if such a property is deleted and then redefined or if the property is changed into an accessor property. For strict mode functions, the values of the arguments object’s properties are simply a copy of the arguments passed to the function and there is no dynamic linkage between the property values and the formal parameter values.
NOTE 2 The ParameterMap object and its property values are used as a device for specifying the arguments object correspondence to argument bindings. The ParameterMap object and the objects that are the values of its properties are not directly accessible from ECMAScript code. An ECMAScript implementation does not need to actually create or use such objects to implement the specified semantics.
NOTE 3 Arguments objects for strict mode functions define non-configurable accessor properties named "caller" and "callee" which throw a TypeError exception on access. The "callee" property has a more specific meaning for non-strict mode functions and a "caller" property has historically been provided as an implementation-defined extension by some ECMAScript implementations. The strict mode definition of these properties exists to ensure that neither of them is defined in any other manner by conforming ECMAScript implementations.
11 Expressions
11.1 Primary Expressions
Syntax
PrimaryExpression :
this
Identifier
Literal
ArrayInitialiser
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
GeneratorComprehension
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
CoverParenthesizedExpressionAndArrowParameterList:
( Expression
)
( )
( ... Identifier )
(
Expression , ... Identifier)
Supplemental Syntax
When processing the production PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList the following grammar is used to refine the interpretation of CoverParenthesizedExpressionAndArrowParameterList.
ParenthesizedExpression :
( Expression )
Static Semantics
Static Semantics: CoveredParenthesizedExpression
CoverParenthesizedExpressionAndArrowParameterList : ( Expression )
Static Semantics: IsValidSimpleAssignmentTarget
PrimaryExpression :
this
Literal
ArrayInitialiser
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
GeneratorComprehension
RegularExpressionLiteral
TemplateLiteral
PrimaryExpression : Identifier
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
11.1.1 The this Keyword
Runtime Semantics: Evaluation
PrimaryExpression : this
11.1.2 Identifier Reference
Runtime Semantics: Evaluation
PrimaryExpression : Identifier
NOTE: The result of evaluating an Identifier is always a value of type Reference.
11.1.3 Literals
Syntax
Literal :
NullLiteral
ValueLiteral
ValueLiteral :
BooleanLiteral
NumericLiteral
StringLiteral
Runtime Semantics
Runtime Semantics: Evaluation
Literal : NullLiteral
ValueLiteral : BooleanLiteral
ValueLiteral : NumericLiteral
ValueLiteral : StringLiteral
11.1.4 Array Initialiser
Syntax
ArrayInitialiser :
ArrayLiteral
ArrayComprehension
11.1.4.1 Array Literal
NOTE An ArrayLiteral is an expression describing the initialisation of an Array object, using a list, of zero or more expressions each of which represents an array element, enclosed in square brackets. The elements need not be literals; they are evaluated each time the array initialiser is evaluated.
Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in the element list is not preceded by an AssignmentExpression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined. If an element is elided at the end of an array, that element does not contribute to the length of the Array.
Syntax
ArrayLiteral :
[ Elisionopt ]
[ ElementList ]
[ ElementList , Elisionopt ]
ElementList :
Elisionopt AssignmentExpression
Elisionopt SpreadElement
ElementList , Elisionopt AssignmentExpression
ElementList , Elisionopt
SpreadElement
Elision :
,
Elision
,
SpreadElement :
… AssignmentExpression
Static Semantics
Static Semantics: Elision Width
Elision : ,
Elision : Elision ,
Runtime Semantics
Runtime Semantics: Array Accumulation
With parameters array and nextIndex.
ElementList : Elisionopt AssignmentExpression
ElementList : Elisionopt SpreadElement
ElementList : ElementList , Elisionopt AssignmentExpression
ElementList : ElementList , Elisionopt SpreadElement
SpreadElement : … AssignmentExpression
NOTE [[DefineOwnProperty]] is used to ensure that own properties are defined for the array even if the standard built-in Array prototype object has been modified in a manner that would preclude the creation of new own properties using [[SetP]].
Runtime Semantics: Evaluation
ArrayLiteral : [ Elisionopt ]
ArrayLiteral : [ ElementList ]
ArrayLiteral : [ ElementList , Elisionopt ]
11.1.4.2 Array Comprehension
Syntax
ArrayComprehension :
[
AssignmentExpression ComprehensionForList ]
[ AssignmentExpression ComprehensionForList if Expression ]
ComprehensionForList :
ComprehensionFor
ComprehensionForList ComprehensionFor
ComprehensionFor :
for ForBinding of Expression
ForBinding :
BindingIdentifier
BindingPattern
Runtime Semantics
Runtime Semantics: Binding Initialisation
With arguments value and environment.
NOTE undefined is passed for environment to indicate that a PutValue operation should be used to assign the initialisation value. This is the case for var statements formal parameter lists of non-strict functions. In those cases a lexical binding is hosted and preinitialized prior to evaluation of its initializer.
ForBinding : BindingPattern
Runtime Semantics: Evaluation
ToDo
11.1.5 Object Initialiser
NOTE An object initialiser is an expression describing the initialisation of an Object, written in a form resembling a literal. It is a list of zero or more pairs of property names and associated values, enclosed in curly braces. The values need not be literals; they are evaluated each time the object initialiser is evaluated.
Syntax
ObjectLiteral :
{ }
{ PropertyDefinitionList }
{ PropertyDefinitionList , }
PropertyDefinitionList :
PropertyDefinition
PropertyDefinitionList , PropertyDefinition
PropertyDefinition :
IdentifierName
CoverInitialisedName
PropertyName : AssignmentExpression
MethodDefinition
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
CoverInitialisedName :
IdentifierName Initialiser
Initialiser :
= AssignmentExpression
NOTE 1 MethodDefinition is defined in 13.3.
NOTE 2 In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar. The CoverInitialisedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
Static Semantics
Static Semantics: Early Errors
In addition to describe an actual object initialiser the ObjectLiteral productions are used as a cover grammar for ObjectAssignmentPattern (11.13.1). When ObjectLiteral appears in a context where ObjectAssignmentPattern is required, the following Early Error rules are not applied.
ObjectLiteral : { PropertyDefinitionList }
and
ObjectLiteral : { PropertyDefinitionList , }
PropertyDefinition : MethodDefinition
PropertyDefinition : IdentifierName
PropertyDefinition : CoverInitialisedName
NOTE This production exists so that ObjectLiteral can serve as a cover grammar for ObjectAssignmentPattern (11.13.1). It can not occur in an actual object initialiser.
Static Semantics: Contains
With parameter symbol.
PropertyDefinition : MethodDefinition
NOTE Static semantic rules that depend upon substructure generally do not look into function definitions.
PropertyName : IdentifierName
Static Semantics: IsValidSimpleAssignmentTarget
PrimaryExpression : Literal
Static Semantics: PropName
PropertyDefinition : IdentifierName
PropertyDefinition : PropertyName : AssignmentExpression
PropertyName : StringLiteral
PropertyName : NumericLiteral
Static Semantics: PropertyNameList
PropertyDefinitionList : PropertyDefinition
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
Runtime Semantics
Runtime Semantics: Evaluation
ObjectLiteral : { }
ObjectLiteral :
{
PropertyDefinitionList }
{ PropertyDefinitionList , }
Runtime Semantics: Property Definition Evaluation
With parameter object.
PropertyDefinitionList : PropertyDefinitionList ,
PropertyDefinition
PropertyDefinition : IdentifierName
PropertyDefinition : PropertyName : AssignmentExpression
11.1.6 Function Defining Expressions
See 13.1 for PrimaryExpression : FunctionExpression.
See 13.4 for PrimaryExpression : GeneratorExpression.
See 13.5 for PrimaryExpression : ClassExpression.
11.1.7 Generator Comprehensions
Syntax
GeneratorComprehension :
( Expression
ComprehensionForList )
( Expression ComprehensionForList if Expression )
11.1.8 Regular Expression Literals
Syntax
See 7.8.5.
Static Semantics
Static Semantics: Early Errors
PrimaryExpression : RegularExpressionLiteral
Runtime Semantics
Runtime Semantics: Evaluation
PrimaryExpression : RegularExpressionLiteral
11.1.9 Template Literals
Syntax
TemplateLiteral :
NoSubstitutionTemplate
TemplateHead Expression
[Lexical goal InputElementTemplateTail] TemplateSpans
TemplateSpans:
TemplateTail
TemplateMiddleList [Lexical goal InputElementTemplateTail]
TemplateTail
TemplateMiddleList:
TemplateMiddle Expression
TemplateMiddleList
[Lexical goal InputElementTemplateTail] TemplateMiddle Expression
Static Semantics
Static Semantics: TemplateStrings
With parameter raw.
TemplateLiteral : NoSubstitutionTemplate
TemplateLiteral : TemplateHead Expression [Lexical goal InputElementTemplateTail] TemplateSpans
TemplateSpans : TemplateTail
TemplateSpans : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateTail
TemplateMiddleList : TemplateMiddle Expression
TemplateMiddleList : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateMiddle Expression
Runtime Semantics
Runtime Semantics: ArgumentListEvaluation
TemplateLiteral : NoSubstitutionTemplate
TemplateLiteral : TemplateHead Expression [Lexical goal InputElementTemplateTail] TemplateSpans
Runtime Semantics: GetTemplateCallSite Abstract Operation
The abstract operation GetTemplateCallSite is called with a grammar production, templateLiteral, as an argument. It performs the following steps:
NOTE 1 The creation of a call site object cannot result in an abrupt completion.
NOTE 2 Each TemplateLiteral in the program code is associated with a unique Template call site object that is used in the evaluation of tagged Templates (11.2.6). The same call site object is used each time a specific tagged Template is evaluated. Whether call site objects are created lazily upon first evaluation of the TemplateLiteral or eagerly prior to first evaluation is an implementation choice that is not observable to ECMAScript code.
Runtime Semantics: SubstitutionEvaluation
TemplateSpans : TemplateTail
TemplateSpans : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateTail
TemplateMiddleList : TemplateMiddle Expression
TemplateMiddleList : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateMiddle Expression
Runtime Semantics: Evaluation
TemplateLiteral : NoSubstitutionTemplate
TemplateLiteral : TemplateHead Expression [Lexical goal InputElementTemplateTail] TemplateSpans
TemplateSpans : TemplateTail
TemplateSpans : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateTail
TemplateMiddleList : TemplateMiddle Expression
TemplateMiddleList : TemplateMiddleList [Lexical goal InputElementTemplateTail] TemplateMiddle Expression
11.1.10 The Grouping Operator
Static Semantics: Early Errors
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
Static Semantics: IsValidSimpleAssignmentTarget
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
ParenthesizedExpression : ( Expression )
Runtime Semantics: Evaluation
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
ParenthesizedExpression : ( Expression )
NOTE This algorithm does not apply GetValue to the result of evaluating Expression. The principal motivation for this is so that operators such as delete and typeof may be applied to parenthesised expressions.
11.2 Left-Hand-Side Expressions
Syntax
MemberExpression :
[Lexical goal InputElementRegExp]
PrimaryExpression
MemberExpression [
Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
super [ Expression ]
super . IdentifierName
new MemberExpression Arguments
NewExpression :
MemberExpression
new NewExpression
CallExpression :
MemberExpression Arguments
super Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression
. IdentifierName
CallExpression
TemplateLiteral
Arguments :
( )
( ArgumentList )
ArgumentList :
AssignmentExpression
... AssignmentExpression
ArgumentList , AssignmentExpression
ArgumentList , ... AssignmentExpression
LeftHandSideExpression :
NewExpression
CallExpression
Static Semantics
Static Semantics: Contains
With parameter symbol.
MemberExpression : MemberExpression . IdentifierName
MemberExpression : super . IdentifierName
CallExpression : CallExpression . IdentifierName
Static Semantics: IsValidSimpleAssignmentTarget
CallExpression :
MemberExpression Arguments
super Arguments
CallExpression Arguments
CallExpression [ Expression
]
CallExpression . IdentifierName
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
super [ Expression ]
super . IdentifierName
CallExpression : CallExpression TemplateLiteral
NewExpression : new NewExpression
MemberExpression : new MemberExpression Arguments
11.2.1 Property Accessors
Properties are accessed by name, using either the dot notation:
MemberExpression . IdentifierName
CallExpression . IdentifierName
or the bracket notation:
MemberExpression [ Expression ]
CallExpression [ Expression
]
The dot notation is explained by the following syntactic conversion:
MemberExpression . IdentifierName
is identical in its behaviour to
MemberExpression [ <identifier-name-string> ]
and similarly
CallExpression . IdentifierName
is identical in its behaviour to
CallExpression [ <identifier-name-string> ]
where <identifier-name-string> is a string literal containing the same sequence of characters after processing of Unicode escape sequences as the IdentifierName.
Runtime Semantics: Evaluation
MemberExpression : MemberExpression [ Expression ]
CallExpression : CallExpression [ Expression ]
Is evaluated in exactly the same manner as MemberExpression : MemberExpression [ Expression ] except that the contained CallExpression is evaluated in step 1.
11.2.2 The new Operator
Runtime Semantics: Evaluation
NewExpression : new NewExpression
MemberExpression : new MemberExpression Arguments
11.2.3 Function Calls
Runtime Semantics: Evaluation
CallExpression : MemberExpression Arguments
CallExpression : CallExpression Arguments
Runtime Semantics: EvaluateCall Abstract Operation
The abstract operation EvaluateCall takes as arguments a value ref, and a syntactic grammar production arguments, and a Boolean argument tailPosition. It performs the following steps:
A tail position call must either release any transient internal resources associated with the currently executing function execution context before invoking the target function or reuse those resources in support of the target function.
NOTE 1 For example, a tail position call should only grow an implementation’s activication record stack by the amount that the size of the target function’s activation record exceeds the size of the calling function’s activation record. If the target function’s activation record is smaller, then the total size of the stack should decrease.
NOTE 2 The returned result will never be of type Reference if func is an ordinary object. Whether calling an exotic object can return a value of type Reference is implementation-dependent. If a value of type Reference is returned, it must be a non-strict Property Reference.
11.2.4 The super Keyword
Static Semantics
Static Semantics: Early Errors
MemberExpression :
super [
Expression ]
super . IdentifierName
CallExpression : super Arguments
Runtime Semantics: Evaluation
MemberExpression : super [ Expression ]
MemberExpression : super . IdentifierName
CallExpression : super Arguments
11.2.5 Argument Lists
The evaluation of an argument list produces a List of values (see 8.7).
Runtime Semantics
Runtime Semantics: ArgumentListEvaluation
Arguments : ( )
ArgumentList : AssignmentExpression
ArgumentList : … AssignmentExpression
ArgumentList : ArgumentList , AssignmentExpression
ArgumentList : ArgumentList , … AssignmentExpression
11.2.6 Tagged Templates
Runtime Semantics
Runtime Semantics: Evaluation
MemberExpression : MemberExpression TemplateLiteral
CallExpression : CallExpression TemplateLiteral
11.3 Postfix Expressions
Syntax
PostfixExpression :
LeftHandSideExpression
LeftHandSideExpression [no LineTerminator here]
++
LeftHandSideExpression [no LineTerminator
here] --
Static Semantics
Static Semantics: Early Errors
PostfixExpression :
LeftHandSideExpression [no
LineTerminator
here] ++
LeftHandSideExpression
[no LineTerminator here] --
Static Semantics: IsValidSimpleAssignmentTarget
PostfixExpression :
LeftHandSideExpression [no
LineTerminator
here] ++
LeftHandSideExpression
[no LineTerminator here] --
11.3.1 Postfix Increment Operator
Runtime Semantics: Evaluation
PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++
11.3.2 Postfix Decrement Operator
Runtime Semantics: Evaluation
PostfixExpression : LeftHandSideExpression [no LineTerminator here] --
11.4 Unary Operators
Syntax
UnaryExpression :
PostfixExpression
delete UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
++
UnaryExpression
--
UnaryExpression
+ UnaryExpression
- UnaryExpression
~ UnaryExpression
! UnaryExpression
Static Semantics
Static Semantics: Early Errors
UnaryExpression :
delete UnaryExpression
UnaryExpression :
++
UnaryExpression
-- UnaryExpression
Static Semantics: IsValidSimpleAssignmentTarget
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
++
UnaryExpression
--
UnaryExpression
+ UnaryExpression
- UnaryExpression
~ UnaryExpression
! UnaryExpression
11.4.1 The delete Operator
Static Semantics: Early Errors
UnaryExpression : delete UnaryExpression
Runtime Semantics: Evaluation
UnaryExpression : delete UnaryExpression
NOTE When a delete operator occurs within strict mode code, a SyntaxError exception is thrown if its UnaryExpression is a direct reference to a variable, function argument, or function name. In addition, if a delete operator occurs within strict mode code and the property to be deleted has the attribute { [[Configurable]]: false }, a TypeError exception is thrown.
11.4.2 The void Operator
Runtime Semantics: Evaluation
UnaryExpression : void UnaryExpression
NOTE GetValue must be called even though its value is not used because it may have observable side-effects.
11.4.3 The typeof Operator
Runtime Semantics: Evaluation
UnaryExpression : typeof UnaryExpression
Table 28 — typeof Operator Results
|
Type of val |
Result |
|
Undefined |
"undefined" |
|
Null |
"object" |
|
Boolean |
"boolean" |
|
Number |
"number" |
|
String |
"string" |
|
Object (ordinary and does not implement [[Call]]) |
"object" |
|
Object (implements [[Call]]) |
"function" |
|
Object (exotic and does not implement [[Call]]) |
Implementation-defined unless explicitly specified. May not be "undefined", "boolean", "number", or "string". |
11.4.4 Prefix Increment Operator
Runtime Semantics: Evaluation
UnaryExpression : ++ UnaryExpression
11.4.5 Prefix Decrement Operator
Runtime Semantics: Evaluation
UnaryExpression : -- UnaryExpression
11.4.6 Unary + Operator
NOTE The unary + operator converts its operand to Number type.
Runtime Semantics: Evaluation
UnaryExpression : + UnaryExpression
11.4.7 Unary - Operator
NOTE The unary - operator converts its operand to Number type and then negates it. Negating +0 produces −0, and negating −0 produces +0.
Runtime Semantics: Evaluation
UnaryExpression : - UnaryExpression
11.4.8 Bitwise NOT Operator ( ~ )
Runtime Semantics: Evaluation
UnaryExpression : ~ UnaryExpression
11.4.9 Logical NOT Operator ( ! )
Runtime Semantics: Evaluation
UnaryExpression : ! UnaryExpression
11.5 Multiplicative Operators
Syntax
MultiplicativeExpression :
UnaryExpression
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
Static Semantics: IsValidSimpleAssignmentTarget
MultiplicativeExpression :
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
Runtime Semantics: Evaluation
The production MultiplicativeExpression : MultiplicativeExpression @ UnaryExpression, where @ stands for one of the operators in the above definitions, is evaluated as follows:
11.5.1 Applying the * Operator
The * operator performs multiplication, producing the product of its operands. Multiplication is commutative. Multiplication is not always associative in ECMAScript, because of finite precision.
The result of a floating-point multiplication is governed by the rules of IEEE 754 binary double-precision arithmetic:
11.5.2 Applying the / Operator
The / operator performs division, producing the quotient of its operands. The left operand is the dividend and the right operand is the divisor. ECMAScript does not perform integer division. The operands and result of all division operations are double-precision floating-point numbers. The result of division is determined by the specification of IEEE 754 arithmetic:
11.5.3 Applying the % Operator
The % operator yields the remainder of its operands from an implied division; the left operand is the dividend and the right operand is the divisor.
NOTE In C and C++, the remainder operator accepts only integral operands; in ECMAScript, it also accepts floating-point operands.
The result of a floating-point remainder operation as computed by the % operator is not the same as the “remainder” operation defined by IEEE 754. The IEEE 754 “remainder” operation computes the remainder from a rounding division, not a truncating division, and so its behaviour is not analogous to that of the usual integer remainder operator. Instead the ECMAScript language defines % on floating-point operations to behave in a manner analogous to that of the Java integer remainder operator; this may be compared with the C library function fmod.
The result of an ECMAScript floating-point remainder operation is determined by the rules of IEEE arithmetic:
11.6 Additive Operators
Syntax
AdditiveExpression :
MultiplicativeExpression
AdditiveExpression + MultiplicativeExpression
AdditiveExpression -
MultiplicativeExpression
Static Semantics: IsValidSimpleAssignmentTarget
AdditiveExpression :
AdditiveExpression + MultiplicativeExpression
AdditiveExpression - MultiplicativeExpression
11.6.1 The Addition operator ( + )
NOTE The addition operator either performs string concatenation or numeric addition.
Runtime Semantics: Evaluation
AdditiveExpression : AdditiveExpression + MultiplicativeExpression
NOTE 1 No hint is provided in the calls to ToPrimitive in steps 5 and 6. All standard ECMAScript objects except Date objects handle the absence of a hint as if the hint Number were given; Date objects handle the absence of a hint as if the hint String were given. Exotic objects may handle the absence of a hint in some other manner.
NOTE 2 Step 7 differs from step 3 of the comparison algorithm for the relational operators (11.8.1), by using the logical-or operation instead of the logical-and operation.
11.6.2 The Subtraction Operator ( - )
Runtime Semantics: Evaluation
AdditiveExpression : AdditiveExpression - MultiplicativeExpression
11.6.3 Applying the Additive Operators to Numbers
The + operator performs addition when applied to two operands of numeric type, producing the sum of the operands. The - operator performs subtraction, producing the difference of two numeric operands.
Addition is a commutative operation, but not always associative.
The result of an addition is determined using the rules of IEEE 754 binary double-precision arithmetic:
The - operator performs subtraction when applied to two operands of numeric type, producing the difference of its operands; the left operand is the minuend and the right operand is the subtrahend. Given numeric operands a and b, it is always the case that a–b produces the same result as a +(–b).
11.7 Bitwise Shift Operators
Syntax
ShiftExpression :
AdditiveExpression
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
Static Semantics: IsValidSimpleAssignmentTarget
ShiftExpression :
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
11.7.1 The Left Shift Operator ( << )
NOTE Performs a bitwise left shift operation on the left operand by the amount specified by the right operand.
Runtime Semantics: Evaluation
ShiftExpression : ShiftExpression << AdditiveExpression
11.7.2 The Signed Right Shift Operator ( >> )
NOTE Performs a sign-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
Runtime Semantics: Evaluation
ShiftExpression : ShiftExpression >> AdditiveExpression
11.7.3 The Unsigned Right Shift Operator ( >>> )
NOTE Performs a zero-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
Runtime Semantics: Evaluation
ShiftExpression : ShiftExpression >>> AdditiveExpression
11.8 Relational Operators
NOTE The result of evaluating a relational operator is always of type Boolean, reflecting whether the relationship named by the operator holds between its two operands.
Syntax
RelationalExpression :
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression >
ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression
RelationalExpressionNoIn :
ShiftExpression
RelationalExpressionNoIn < ShiftExpression
RelationalExpressionNoIn > ShiftExpression
RelationalExpressionNoIn <= ShiftExpression
RelationalExpressionNoIn >= ShiftExpression
RelationalExpressionNoIn instanceof ShiftExpression
The semantics of the RelationalExpressionNoIn productions are the same as the RelationalExpression productions except that the contained RelationalExpressionNoIn is used in place of the contained RelationalExpression.
NOTE The “NoIn” variants are needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.
Static Semantics: IsValidSimpleAssignmentTarget
RelationalExpression :
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <=
ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in
ShiftExpression
11.8.1 Runtime Semantics
Runtime Semantics: The Abstract Relational Comparison Algorithm
The comparison x < y, where x and y are values, produces true, false, or undefined (which indicates that at least one operand is NaN). In addition to x and y the algorithm takes a Boolean flag named LeftFirst as a parameter. The flag is used to control the order in which operations with potentially visible side-effects are performed upon x and y. It is necessary because ECMAScript specifies left to right evaluation of expressions. The default value of LeftFirst is true and indicates that the x parameter corresponds to an expression that occurs to the left of the y parameter’s corresponding expression. If LeftFirst is false, the reverse is the case and operations must be performed upon y before x. Such a comparison is performed as follows:
NOTE 1 Step 3 differs from step 7 in the algorithm for the addition operator + (11.6.1) in using and instead of or.
NOTE 2 The comparison of Strings uses a simple lexicographic ordering on sequences of code unit values. There is no attempt to use the more complex, semantically oriented definitions of character or string equality and collating order defined in the Unicode specification. Therefore String values that are canonically equal according to the Unicode standard could test as unequal. In effect this algorithm assumes that both Strings are already in normalised form. Also, note that for strings containing supplementary characters, lexicographic ordering on sequences of UTF-16 code unit values differs from that on sequences of code point values.
Runtime Semantics: Evaluation
RelationalExpression : RelationalExpression < ShiftExpression
RelationalExpression : RelationalExpression > ShiftExpression
RelationalExpression : RelationalExpression <= ShiftExpression
RelationalExpression : RelationalExpression >= ShiftExpression
RelationalExpression: RelationalExpression instanceof ShiftExpression
The abstract operation HasInstanceOperator implements the generic algorithm for determining if an object O inherits from the inheritance path defined by constructor C. This abstract operation performs, the following steps:
RelationalExpression : RelationalExpression in ShiftExpression
11.9 Equality Operators
NOTE The result of evaluating an equality operator is always of type Boolean, reflecting whether the relationship named by the operator holds between its two operands.
Syntax
EqualityExpression :
RelationalExpression
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
EqualityExpression [no LineTerminator here] is RelationalExpression
EqualityExpression [no LineTerminator here] isnt
RelationalExpression
EqualityExpressionNoIn :
RelationalExpressionNoIn
EqualityExpressionNoIn == RelationalExpressionNoIn
EqualityExpressionNoIn != RelationalExpressionNoIn
EqualityExpressionNoIn === RelationalExpressionNoIn
EqualityExpressionNoIn !== RelationalExpressionNoIn
EqualityExpression
[no LineTerminator here] is RelationalExpression
EqualityExpression [no LineTerminator here] isnt RelationalExpression
The semantics of the EqualityExpressionNoIn productions are the same as the EqualityExpression productions except that the contained EqualityExpressionNoIn and RelationalExpressionNoIn are used in place of the contained EqualityExpression and RelationalExpression, respectively.
Static Semantics: IsValidSimpleAssignmentTarget
EqualityExpression :
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
EqualityExpression [no LineTerminator here] is
RelationalExpression
EqualityExpression [no LineTerminator here]
isnt RelationalExpression
11.9.1 Runtime Semantics
Runtime Semantics: The Abstract Equality Comparison Algorithm
The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
NOTE 1 Given the above definition of equality:
NOTE 2 The equality operators maintain the following invariants:
NOTE 3 The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two String objects would not be equal to each other. For Example:
NOTE 4 Comparison of Strings uses a simple equality test on sequences of code unit values. There is no attempt to use the more complex, semantically oriented definitions of character or string equality and collating order defined in the Unicode specification. Therefore Strings values that are canonically equal according to the Unicode standard could test as unequal. In effect this algorithm assumes that both Strings are already in normalised form.
Runtime Semantics: The Strict Equality Comparison Algorithm
The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed as follows:
NOTE This algorithm differs from the SameValue Algorithm (9.12) in its treatment of signed zeroes and NaNs.
Runtime Semantics: Evaluation
EqualityExpression : EqualityExpression == RelationalExpression
EqualityExpression : EqualityExpression != RelationalExpression
EqualityExpression : EqualityExpression === RelationalExpression
EqualityExpression : EqualityExpression !== RelationalExpression
EqualityExpression : EqualityExpression [no LineTerminator here] is RelationalExpression
EqualityExpression : EqualityExpression [no LineTerminator here] isnt RelationalExpression
11.10 Binary Bitwise Operators
Syntax
BitwiseANDExpression :
EqualityExpression
BitwiseANDExpression & EqualityExpression
BitwiseANDExpressionNoIn :
EqualityExpressionNoIn
BitwiseANDExpressionNoIn & EqualityExpressionNoIn
BitwiseXORExpression :
BitwiseANDExpression
BitwiseXORExpression ^ BitwiseANDExpression
BitwiseXORExpressionNoIn :
BitwiseANDExpressionNoIn
BitwiseXORExpressionNoIn ^ BitwiseANDExpressionNoIn
BitwiseORExpression :
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
BitwiseORExpressionNoIn :
BitwiseXORExpressionNoIn
BitwiseORExpressionNoIn | BitwiseXORExpressionNoIn
Static Semantics: IsValidSimpleAssignmentTarget
BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
Runtime Semantics: Evaluation
The production A : A @ B, where @ is one of the bitwise operators in the productions above, is evaluated as follows:
11.11 Binary Logical Operators
Syntax
LogicalANDExpression :
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalANDExpressionNoIn :
BitwiseORExpressionNoIn
LogicalANDExpressionNoIn && BitwiseORExpressionNoIn
LogicalORExpression :
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
LogicalORExpressionNoIn :
LogicalANDExpressionNoIn
LogicalORExpressionNoIn || LogicalANDExpressionNoIn
The semantics of the LogicalANDExpressionNoIn and LogicalORExpressionNoIn productions are the same manner as the LogicalANDExpression and LogicalORExpression productions except that the contained LogicalANDExpressionNoIn, BitwiseORExpressionNoIn and LogicalORExpressionNoIn are used in place of the contained LogicalANDExpression, BitwiseORExpression and LogicalORExpression, respectively.
NOTE The value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.
Static Semantics: IsValidSimpleAssignmentTarget
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
LogicalORExpression : LogicalORExpression || LogicalANDExpression
Runtime Semantics: Evaluation
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
LogicalORExpression : LogicalORExpression || LogicalANDExpression
11.12 Conditional Operator ( ? : )
Syntax
ConditionalExpression :
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
ConditionalExpressionNoIn :
LogicalORExpressionNoIn
LogicalORExpressionNoIn ? AssignmentExpression : AssignmentExpressionNoIn
The semantics of the ConditionalExpressionNoIn production is the same as the ConditionalExpression production except that the contained LogicalORExpressionNoIn, AssignmentExpression and AssignmentExpressionNoIn are used in place of the contained LogicalORExpression, first AssignmentExpression and second AssignmentExpression, respectively.
NOTE The grammar for a ConditionalExpression in ECMAScript is a little bit different from that in C and Java, which each allow the second subexpression to be an Expression but restrict the third expression to be a ConditionalExpression. The motivation for this difference in ECMAScript is to allow an assignment expression to be governed by either arm of a conditional and to eliminate the confusing and fairly useless case of a comma expression as the centre expression.
Static Semantics: IsValidSimpleAssignmentTarget
ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression
Runtime Semantics: Evaluation
ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression
11.13 Assignment Operators
Syntax
AssignmentExpression :
ConditionalExpression
YieldExpression
ArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression
AssignmentOperator AssignmentExpression
AssignmentExpressionNoIn :
ConditionalExpressionNoIn
YieldExpression
ArrowFunction
LeftHandSideExpression =
AssignmentExpressionNoIn
LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn
AssignmentOperator : one of
|
*= |
/= |
%= |
+= |
-= |
<<= |
>>= |
>>>= |
&= |
^= |
|= |
The semantics of the AssignmentExpressionNoIn productions are the same manner as the AssignmentExpression productions except that the contained ConditionalExpressionNoIn and AssignmentExpressionNoIn are used in place of the contained ConditionalExpression and AssignmentExpression, respectively.
Static Semantics
Static Semantics: Early Errors
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression
Static Semantics: IsValidSimpleAssignmentTarget
AssignmentExpression :
YieldExpression
ArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator
AssignmentExpression
Runtime Semantics
Runtime Semantics: Evaluation
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
AssignmentExpression :
LeftHandSideExpression AssignmentOperator AssignmentExpression
NOTE When an assignment occurs within strict mode code, it is an runtime error if lref in step 1.e of the first algorithm or step 9 of the second algorithm it is an unresolvable reference. If it is, a ReferenceError exception is thrown. The LeftHandSide also may not be a reference to a data property with the attribute value {[[Writable]]:false}, to an accessor property with the attribute value {[[Set]]:undefined}, nor to a non-existent property of an object where calling its [[GetExtensible]] internal method returns the value false. In these cases a TypeError exception is thrown.
11.13.1 Destructuring Assignment
Supplemental Syntax
In certain circumstances when processing the production AssignmentExpression : LeftHandSideExpression = AssignmentExpression the following grammar is used to refine the interpretation of LeftHandSideExpression.
AssignmentPattern :
ObjectAssignmentPattern
ArrayAssignmentPattern
ObjectAssignmentPattern :
{ }
{ AssignmentPropertyList }
{ AssignmentPropertyList , }
ArrayAssignmentPattern :
[ Elisionopt AssignmentRestElementopt ]
[ AssignmentElementList
]
[
AssignmentElementList , Elisionopt AssignmentRestElementopt ]
AssignmentPropertyList :
AssignmentProperty
AssignmentPropertyList , AssignmentProperty
AssignmentElementList :
Elisionopt AssignmentElement
AssignmentElementList , Elisionopt
AssignmentElement
AssignmentProperty :
Identifier Initialiseropt
PropertyName :
AssignmentElement
AssignmentElement :
DestructuringAssignmentTarget Initialiseropt
AssignmentRestElement :
… DestructuringAssignmentTarget
DestructuringAssignmentTarget :
LeftHandSideExpression
Static Semantics
Static Semantics: Early Errors
AssignmentProperty : Identifier Initialiseropt
DestructuringAssignmentTarget : LeftHandSideExpression
Runtime Semantics
Runtime Semantics: Destructuring Assignment Evaluation
with parameter obj
ObjectAssignmentPattern : { }
and
ArrayAssignmentPattern :
[]
[Elision]
AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
Let status be
AssignmentProperty : Identifier Initialiseropt
AssignmentProperty : PropertyName : AssignmentElement
ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
ArrayAssignmentPattern : [ AssignmentElementList ]
ArrayAssignmentPattern :
[ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
Runtime Semantics: Indexed Destructuring Assignment Evaluation
with parameters obj and index
AssignmentElementList : Elisionopt AssignmentElement
AssignmentElementList : AssignmentElementList , Elisionopt AssignmentElement
AssignmentRestElement : … DestructuringAssignmentTarget
Runtime Semantics: Keyed Destructuring Assignment Evaluation
with parameters obj and propertyName
AssignmentElement : DestructuringAssignmentTarget Initialiseropt
11.14 Comma Operator ( , )
Syntax
Expression :
AssignmentExpression
Expression , AssignmentExpression
ExpressionNoIn :
AssignmentExpressionNoIn
ExpressionNoIn , AssignmentExpressionNoIn
The semantics of the ExpressionNoIn production is the same manner as the Expression production except that the contained ExpressionNoIn and AssignmentExpressionNoIn are used in place of the contained Expression and AssignmentExpression, respectively.
Static Semantics: IsValidSimpleAssignmentTarget
Expression : Expression , AssignmentExpression
Runtime Semantics: Evaluation
Expression : Expression , AssignmentExpression
NOTE GetValue must be called even though its value is not used because it may have observable side-effects.
12 Statements and Declarations
Syntax
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
BreakableStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
ThrowStatement
TryStatement
DebuggerStatement
Declaration :
FunctionDeclaration
GeneratorDeclaration
ClassDeclaration
LexicalDeclaration
BreakableStatement :
IterationStatement
SwitchStatement
Static Semantics
Static Semantics: VarDeclaredNames
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Runtime Semantics
Runtime Semantics: Labelled Evaluation
With argument labelSet.
BreakableStatement : IterationStatement
BreakableStatement : SwitchStatement
NOTE A BreakableStatement is one that can be exited via an unlabelled BreakStatement.
Runtime Semantics: Evaluation
BreakableStatement :
IterationStatement
SwitchStatement
12.1 Block
Syntax
BlockStatement :
Block
Block :
{ StatementListopt }
StatementList :
StatementListItem
StatementList StatementListItem
StatementListItem :
Statement
Declaration
Static Semantics
Static Semantics: Early Errors
Block : { StatementList }
Static Semantics: LexicalDeclarations
StatementList : StatementList StatementListItem
StatementListItem : Statement
StatementListItem : Declaration
Static Semantics: LexicallyDeclaredNames
Block : { }
StatementList : StatementList StatementListItem
StatementListItem : Statement
StatementListItem : Declaration
Static Semantics: TopLevelLexicallyDeclaredNames
StatementList : StatementList StatementListItem
StatementListItem : Statement
StatementListItem : Declaration
NOTE At the top level of a function, or script, function declarations are treated like var declarations rather than like lexical declarations.
Static Semantics: TopLevelLexicallyScopedDeclarations
StatementList : StatementList StatementListItem
StatementListItem : Statement
StatementListItem : Declaration
Static Semantics: TopLevelVarDeclaredNames
StatementList : StatementList StatementListItem
StatementListItem : Declaration
StatementListItem : Statement
NOTE At the top level of a function or script, inner function declarations are treated like var declarations.
Static Semantics: TopLevelVarScopedDeclarations
StatementList : StatementList StatementListItem
StatementListItem : Statement
StatementListItem : Declaration
Static Semantics: VarDeclaredNames
Block : { }
StatementList : StatementList StatementListItem
StatementListItem : Declaration
Runtime Semantics
Runtime Semantics: Evaluation
Block : { }
Block : { StatementList }
NOTE No matter how control leaves the Block the LexicalEnvironment is always restored to its former state.
StatementList : StatementList StatementListItem
NOTE Steps 4 and 5 of the above algoritm ensure that the value of a StatementList is the value of the last value producing Statement in the StatementList. For example, the following calls to the eval function all return the value 1:
eval("1;;;;;")
eval("1;{}")
eval("1;var a;")
12.2 Declarations and the Variable Statement
12.2.1 Let and Const Declarations
NOTE A let and const declarations define variables that are scoped to the running execution context’s LexicalEnvironment. The variables are created when their containing Lexical Environment is instantiated but may not be accessed in any way until the variable’s LexicalBinding is evaluated. A variable defined by a LexicalBinding with an Initialiser is assigned the value of its Initialiser’s AssignmentExpression when the LexicalBinding is evaluated, not when the variable is created. If a LexicalBinding in a let declaration does not have an an Initialiser the variable is assigned the value undefined when the LexicalBinding is evaluated.
Syntax
LexicalDeclaration :
LetOrConst BindingList ;
LexicalDeclarationNoIn :
LetOrConst BindingListNoIn
LetOrConst :
let
const
BindingList :
LexicalBinding
BindingList , LexicalBinding
BindingListNoIn :
LexicalBindingNoIn
BindingListNoIn , LexicalBindingNoIn
LexicalBinding :
BindingIdentifier Initialiseropt
BindingPattern Initialiser
LexicalBindingNoIn :
BindingIdentifier InitialiserNoInopt
BindingPattern InitialiserNoIn
BindingIdentifier :
Identifier
InitialiserNoIn :
= AssignmentExpressionNoIn
The semantics of the LexicalDeclarationNoIn, BindingListNoIn, LexicalBindingNoIn and InitialiserNoIn productions are the same as the LexicalDeclaration, BindingList, LexicalBinding and Initialiser productions except that the contained BindingListNoIn, LexicalBindingNoIn, InitialiserNoIn and AssignmentExpressionNoIn are used in place of the contained BindingList, LexicalBinding, Initialiser and AssignmentExpression, respectively.
Static Semantics
Static Semantics: Early Errors
LexicalBinding : BindingIdentifier
BindingIdentifier : Identifier
Static Semantics: BoundNames
LexicalDeclaration : LetOrConst BindingList ;
BindingList : BindingList , LexicalBinding
LexicalBinding : BindingIdentifier Initialiseropt
LexicalBinding: BindingPattern Initialiser
BindingIdentifier : Identifier
Static Semantics: IsConstantDeclaration
LexicalDeclaration : LetOrConst BindingList ;
LetOrConst : let
LetOrConst : const
Runtime Semantics
Runtime Semantics: Binding Initialisation
With arguments value and environment.
NOTE undefined is passed for environment to indicate that a PutValue operation should be used to assign the initialisation value. This is the case for var statements formal parameter lists of non-strict functions. In those cases a lexical binding is hosted and preinitialized prior to evaluation of its initializer.
BindingIdentifier : Identifier
Runtime Semantics: Evaluation
LexicalDeclaration : LetOrConst BindingList ;
BindingList : BindingList , LexicalBinding
LexicalBinding : BindingIdentifier
NOTE A static semantics rule ensures that this form of LexicalBinding never occurs in a const declaration.
LexicalBinding : BindingIdentifier Initialiser
LexicalBinding: BindingPattern Initialiser
12.2.2 Variable Statement
NOTE A var statement declares variables that are scoped to the running execution context’s VariableEnvironment. Var variables are created when their containing Lexical Environment is instantiated and are initialised to undefined when created. Within the scope of any VariableEnvironemnt a common Identifier may appear in more than one VariableDeclaration but those declarations collective define only one variable. A variable defined by a VariableDeclaration with an Initialiser is assigned the value of its Initialiser’s AssignmentExpression when the VariableDeclaration is executed, not when the variable is created.
Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
BindingIdentifier Initialiseropt
BindingPattern Initialiser
VariableDeclarationNoIn :
BindingIdentifier InitialiserNoInopt
BindingPattern InitialiserNoIn
The semantics of the VariableDeclarationListNoIn, VariableDeclarationNoIn and InitialiserNoIn productions are the same as the VariableDeclarationList, VariableDeclaration and Initialiser productions except that the contained VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn and AssignmentExpressionNoIn are used in of the contained VariableDeclarationList, VariableDeclaration, Initialiser and AssignmentExpression, respectively.
Static Semantics
Static Semantics: BoundNames
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
VariableDeclaration : BindingIdentifier Initialiseropt
VariableDeclaration : BindingPattern Initialiser
Runtime Semantics
Runtime Semantics: Binding Initialisation
With arguments value and environment.
NOTE undefined is passed for environment to indicate that a PutValue operation should be used to assign the initialisation value. This is the case for var statements formal parameter lists of non-strict functions. In those cases a lexical binding is hosted and preinitialized prior to evaluation of its initializer.
VariableDeclaration : BindingIdentifier
VariableDeclaration : BindingIdentifier Initialiser
VariableDeclaration : BindingPattern Initialiser
Runtime Semantics: Evaluation
VariableStatement : var VariableDeclarationList ;
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
VariableDeclaration : BindingIdentifier
VariableDeclaration : BindingIdentifier Initialiser
NOTE If a VariableDeclaration is nested within a with statement and the Identifier in the VariableDeclaration is the same as a property name of the binding object of the with statement’s object environment record, then step 3 will assign value to the property instead of to the VariableEnvironment binding of the Identifier.
VariableDeclaration : BindingPattern Initialiser
12.2.4 Destructuring Binding Patterns
Syntax
BindingPattern :
ObjectBindingPattern
ArrayBindingPattern
ObjectBindingPattern :
{ }
{ BindingPropertyList }
{
BindingPropertyList , }
ArrayBindingPattern :
[ Elisionopt BindingRestElementopt ]
[ BindingElementList ]
[
BindingElementList , Elisionopt BindingRestElementopt ]
BindingPropertyList :
BindingProperty
BindingPropertyList , BindingProperty
BindingElementList :
Elisionopt BindingElement
BindingElementList , Elisionopt
BindingElement
BindingProperty :
SingleNameBinding
PropertyName :
BindingElement
BindingElement :
SingleNameBinding
BindingPattern Initialiseropt
SingleNameBinding :
BindingIdentifier Initialiseropt
BindingRestElement :
... BindingIdentifier
Static Semantics
Static Semantics: Early Errors
BindingPattern : ObjectBindingPattern
BindingPattern : ArrayBindingPattern
Static Semantics: BoundNames
ObjectBindingPattern: { }
ArrayBindingPattern : [ Elisionopt ]
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
BindingPropertyList : BindingPropertyList , BindingProperty
BindingElementList : Elisionopt BindingElement
BindingElementList : BindingElementList , Elisionopt BindingElement
BindingProperty : PropertyName : BindingElement
SingleNameBinding : BindingIdentifier Initialiseropt
BindingElement : BindingPattern Initialiseropt
Static Semantics: HasInitialiser
BindingElement : BindingPattern
BindingElement : BindingPattern Initialiser
SingleNameBinding : BindingIdentifier
SingleNameBinding : BindingIdentifier Initialiser
Runtime Semantics
Runtime Semantics: Binding Initialisation
With parameters value and environment.
NOTE When undefined is passed for environment it indicates that a PutValue operation should be used to assign the initialisation value. This is the case for formal parameter lists of non-strict functions. In that case the formal parameter bindings are preinitialized in order to deal with the possibility of multiple parameters with the same name.
BindingPattern : ObjectBindingPattern
BindingPattern : ArrayBindingPattern
ObjectBindingPattern: { }
BindingPropertyList : BindingPropertyList , BindingProperty
BindingProperty : SingleNameBinding
BindingProperty : PropertyName : BindingElement
Runtime Semantics: Indexed Binding Initialisation
With parameters array, nextIndex, and environment.
NOTE When undefined is passed for environment it indicates that a PutValue operation should be used to assign the initialisation value. This is the case for formal parameter lists of non-strict functions. In that case the formal parameter bindings are preinitialized in order to deal with the possibility of multiple parameters with the same name.
ArrayBindingPattern : [ Elisionopt ]
ArrayBindingPattern: [ Elisionopt BindingRestElement ]
ArrayBindingPattern: [ BindingElementList ]
ArrayBindingPattern: [ BindingElementList , Elisionopt]
ArrayBindingPattern: [ BindingElementList , Elisionopt BindingRestElement ]
BindingElementList : Elisionopt BindingElement
BindingElementList : BindingElementList , Elisionopt BindingElement
BindingElement: SingleNameBinding
BindingElement: BindingPattern Initialiseropt
BindingRestElement : … BindingIdentifier
Runtime Semantics: Keyed Binding Initialisation
With parameters obj, environment, and propertyName.
NOTE When undefined is passed for environment it indicates that a PutValue operation should be used to assign the initialisation value. This is the case for formal parameter lists of non-strict functions. In that case the formal parameter bindings are preinitialized in order to deal with the possibility of multiple parameters with the same name.
BindingElement: BindingPattern Initialiseropt
SingleNameBinding : BindingIdentifier Initialiseropt
12.3 Empty Statement
Syntax
EmptyStatement :
;
Runtime Semantics
Runtime Semantics: Evaluation
EmptyStatement : ;
12.4 Expression Statement
Syntax
ExpressionStatement :
[lookahead ∉ {{, function, class }] Expression ;
NOTE An ExpressionStatement cannot start with an opening curly brace because that might make it ambiguous with a Block. Also, an ExpressionStatement cannot start with the function or class keywords because that would make it ambiguous with a FunctionDeclaration, a GeneratorDeclaration, or a ClassDeclaration.
Runtime Semantics
Runtime Semantics: Evaluation
ExpressionStatement : [lookahead ∉ {{, function, class }] Expression;
12.5 The if Statement
Syntax
IfStatement :
if ( Expression ) Statement else Statement
if ( Expression ) Statement
Each else for which the choice of associated if is ambiguous shall be associated with the nearest possible if that would otherwise have no corresponding else.
Static Semantics: VarDeclaredNames
IfStatement : if ( Expression ) Statement else Statement
IfStatement : if ( Expression ) Statement
Runtime Semantics
Runtime Semantics: Evaluation
IfStatement : if ( Expression ) Statement else Statement
IfStatement : if ( Expression ) Statement
12.6 Iteration Statements
Syntax
IterationStatement :
do Statement while ( Expression )
while ( Expression ) Statement
for (ExpressionNoInopt; Expressionopt ; Expressionopt )
Statement
for ( var VariableDeclarationListNoIn; Expressionopt
; Expressionopt ) Statement
for
( LexicalDeclarationNoIn; Expressionopt ; Expressionopt ) Statement
for ( LeftHandSideExpression in Expression )
Statement
for ( var ForBinding in
Expression ) Statement
for ( ForDeclaration in Expression )
Statement
for ( LeftHandSideExpression of Expression ) Statement
for
( var ForBinding of Expression ) Statement
for ( ForDeclaration of Expression
) Statement
ForDeclaration :
LetOrConst ForBinding
NOTE 1 ForBinding is defined in 11.1.4.2.
NOTE 2 A semicolon is not required after a do-while statement.
Runtime Semantics
Runtime Semantics: LoopContinues Abstract Operation
The abstract operation LoopContinues with arguments completion and labelSet is defined by the following step:
NOTE Within the Statement part of an IterationStatement a ContinueStatement may be used to begin a new iteration.
12.6.1 The do-while Statement
Static Semantics: VarDeclaredNames
IterationStatement : do Statement while ( Expression )
Runtime Semantics
Runtime Semantics: Labelled Evaluation
With argument labelSet.
IterationStatement : do Statement while ( Expression )
12.6.2 The while Statement
Static Semantics: VarDeclaredNames
IterationStatement : while ( Expression ) Statement
Runtime Semantics
Runtime Semantics: Labelled Evaluation
With argument labelSet.
IterationStatement : while ( Expression ) Statement
12.6.3 The for Statement
Static Semantics
Static Semantics: VarDeclaredNames
IterationStatement : for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement
IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement
IterationStatement : for (LexicalDeclarationNoIn; Expressionopt ; Expressionopt) Statement
Runtime Semantics
Runtime Semantics: Labelled Evaluation
With argument labelSet.
IterationStatement : for (ExpressionNoInopt
; Expressionopt ; Expressionopt) Statement
IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement
IterationStatement : for ( LexicalDeclarationNoIn ; Expressionopt ; Expressionopt ) Statement
Runtime Semantics: For Body Evaluation Abstract Operation
The abstract operation For Body Evaluation with arguments testExpr, incrementExpr, stmt, and labelSet is performed as follows:
12.6.4 The for-in and for-of Statements
Static Semantics
Static Semantics: Early Errors
IterationStatement :
for (LeftHandSideExpression in Expression ) Statement
for (LeftHandSideExpression of Expression ) Statement
IterationStatement :
for (ForDeclaration in Expression ) Statement
for (ForDeclaration of Expression ) Statement
Static Semantics: BoundNames
ForDeclaration : LetOrConst ForBinding
Static Semantics: VarDeclaredNames
IterationStatement : for ( LeftHandSideExpression in Expression ) Statement
IterationStatement : for ( var ForBinding in Expression ) Statement
IterationStatement : for ( ForDeclaration in Expression ) Statement
IterationStatement : for ( LeftHandSideExpression of Expression ) Statement
IterationStatement : for ( var ForBinding of Expression ) Statement
IterationStatement : for ( ForDeclaration of Expression ) Statement
Runtime Semantics
Runtime Semantics: Binding Instantiation
With arguments value and environment.
ForDeclaration : LetOrConst ForBinding
Runtime Semantics: Labelled Evaluation
With argument labelSet.
IterationStatement : for ( LeftHandSideExpression in Expression ) Statement
IterationStatement : for ( var ForBinding in Expression ) Statement
IterationStatement : for (ForDeclaration in Expression ) Statement
IterationStatement : for ( LeftHandSideExpression of Expression ) Statement
IterationStatement : for ( var ForBinding of Expression ) Statement
IterationStatement : for (ForDeclaration of Expression ) Statement
Runtime Semantics: For In/Of Expression Evaluation Abstract Operation
The abstract operation For In/Of Expression Evaluation is called with arguments expr, iterationKind, and labelSet. The value of iterationKind is either enumerate or iterate.
Runtime Semantics: For In/Of Body Evaluation Abstract Operation
The abstract operation For In/Of Body Evaluation is called with arguments lhs, stmt, keys, lhsKind, and labelSet. The value of lhsKind is either assignment, varBinding or lexicalBinding.
12.7 The continue Statement
Syntax
ContinueStatement :
continue ;
continue [no LineTerminator here] Identifier;
Static Semantics
Static Semantics: Early Errors
ContinueStatement : continue ;
ContinueStatement : continue [no LineTerminator here] Identifier;
Runtime Semantics
Runtime Semantics: Evaluation
ContinueStatement : continue ;
ContinueStatement : continue [no LineTerminator here] Identifier;
12.8 The break Statement
Syntax
BreakStatement :
break ;
break [no LineTerminator here] Identifier ;
Static Semantics
Static Semantics: Early Errors
BreakStatement : break ;
BreakStatement : break [no LineTerminator here] Identifier;
Runtime Semantics
Runtime Semantics: Evaluation
BreakStatement : break ;
BreakStatement : break [no LineTerminator here] Identifier;
12.9 The return Statement
Syntax
ReturnStatement :
return ;
return [no LineTerminator here] Expression ;
NOTE A return statement causes a function to cease execution and return a value to the caller. If Expression is omitted, the return value is undefined. Otherwise, the return value is the value of Expression.
Static Semantics
Static Semantics: Early Errors
Runtime Semantics
Runtime Semantics: Evaluation
ReturnStatement : return ;
ReturnStatement : return [no LineTerminator here] Expression;
12.10 The with Statement
Syntax
WithStatement :
with ( Expression ) Statement
NOTE The with statement adds an object environment record for a computed object to the lexical environment of the running execution context. It then executes a statement using this augmented lexical environment. Finally, it restores the original lexical environment.
Static Semantics
Static Semantics: Early Errors
WithStatement : with ( Expression ) Statement
Static Semantics: VarDeclaredNames
WithStatement : with ( Expression ) Statement
Runtime Semantics
Runtime Semantics: Evaluation
WithStatement : with ( Expression ) Statement
NOTE No matter how control leaves the embedded Statement, whether normally or by some form of abrupt completion or exception, the LexicalEnvironment is always restored to its former state.
12.11 The switch Statement
Syntax
SwitchStatement :
switch ( Expression ) CaseBlock
CaseBlock :
{
CaseClausesopt }
{ CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses :
CaseClause
CaseClauses CaseClause
CaseClause :
case Expression : StatementListopt
DefaultClause :
default : StatementListopt
Static Semantics
Static Semantics: Early Errors
CaseBlock : { CaseClauses }
Static Semantics: LexicalDeclarations
CaseBlock : { }
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses : CaseClauses CaseClause
CaseClause : case Expression : StatementListopt
DefaultClause : default : StatementListopt
Static Semantics: LexicallyDeclaredNames
CaseBlock : { }
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses : CaseClauses CaseClause
CaseClause : case Expression : StatementListopt
DefaultClause : default : StatementListopt
Static Semantics: VarDeclaredNames
SwitchStatement : switch ( Expression ) CaseBlock
CaseBlock : { }
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses : CaseClauses CaseClause
CaseClause : case Expression : StatementListopt
DefaultClause : default : StatementListopt
Runtime Semantics
Runtime Semantics: Case Block Evaluation
With argument input.
CaseBlock : { CaseClausesopt }
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
Runtime Semantics: Case Selector Evaluation
CaseClause : case Expression : StatementListopt
NOTE Case Selector Evaluation does not execute the associated StatementList. It simply evaluates the Expression and returns the value, which the CaseBlock algorithm uses to determine which StatementList to start executing.
Runtime Semantics: Evaluation
SwitchStatement : switch ( Expression ) CaseBlock
NOTE No matter how control leaves the SwitchStatement the LexicalEnvironment is always restored to its former state.
CaseClause : case Expression : [empty]
CaseClause : case Expression : StatementList
DefaultClause : default: [empty]
DefaultClause : default: StatementList
12.12 Labelled Statements
Syntax
LabelledStatement :
Identifier : Statement
NOTE A Statement may be prefixed by a label. Labelled statements are only used in conjunction with labelled break and continue statements. ECMAScript has no goto statement. A Statement can be part of a LabelledStatement, which itself can be part of a LabelledStatement, and so on. The labels introduced this way are collectively referred to as the “current label set” when describing the semantics of individual statements. A LabelledStatement has no semantic meaning other than the introduction of a label to a label set. The label set of an IterationStatement or a SwitchStatement initially contains the single element empty. The label set of any other statement is initially empty.
Static Semantics
Static Semantics: Early Errors
Static Semantics: VarDeclaredNames
LabelledStatement : Identifier : Statement
Runtime Semantics
Runtime Semantics: Labelled Evaluation
With argument labelSet.
LabelledStatement : Identifier : Statement
Runtime Semantics: Evaluation
LabelledStatement : Identifier : Statement
12.13 The throw Statement
Syntax
ThrowStatement :
throw [no LineTerminator here] Expression ;
Runtime Semantics: Evaluation
The production ThrowStatement : throw [no LineTerminator here] Expression ; is evaluated as follows:
12.14 The try Statement
Syntax
TryStatement :
try Block
Catch
try Block Finally
try Block Catch Finally
Catch :
catch ( CatchParameter ) Block
Finally :
finally Block
CatchParameter :
BindingIdentifier
BindingPattern
NOTE The try statement encloses a block of code in which an exceptional condition can occur, such as a runtime error or a throw statement. The catch clause provides the exception-handling code. When a catch clause catches an exception, its Identifier is bound to that exception.
Static Semantics
Static Semantics: Early Errors
Catch : catch ( CatchParameter ) Block
Static Semantics: VarDeclaredNames
TryStatement : try Block Catch
TryStatement : try Block Finally
TryStatement : try Block Catch Finally
Catch : catch ( CatchParameter ) Block
Runtime Semantics
Runtime Semantics: Binding Initialisation
With arguments value and environment.
NOTE undefined is passed for environment to indicate that a PutValue operation should be used to assign the initialisation value. This is the case for var statements formal parameter lists of non-strict functions. In those cases a lexical binding is hosted and preinitialized prior to evaluation of its initializer.
CatchParameter: BindingPattern
Runtime Semantics: Catch Clause Evaluation
with parameter thrownValue
Catch : catch ( CatchParameter ) Block
NOTE No matter how control leaves the Block the LexicalEnvironment is always restored to its former state.
Runtime Semantics: Evaluation
TryStatement : try Block Catch
TryStatement : try Block Finally
TryStatement : try Block Catch Finally
12.15 The debugger statement
Syntax
DebuggerStatement :
debugger ;
Runtime Semantics: Evaluation
NOTE Evaluating the DebuggerStatement production may allow an implementation to cause a breakpoint when run under a debugger. If a debugger is not present or active this statement has no observable effect.
The production DebuggerStatement : debugger ; is evaluated as follows:
13 Functions and Generators
13.1 Function Definitions
Syntax
FunctionDeclaration :
function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FunctionExpression :
function BindingIdentifieropt ( FormalParameterList ) { FunctionBody }
FormalParameterList :
[empty]
FunctionRestParameter
FormalsList
FormalsList, FunctionRestParameter
FormalsList :
FormalParameter
FormalsList , FormalParameter
FunctionRestParameter :
... BindingIdentifier
FormalParameter :
BindingElement
FunctionBody :
StatementListopt
Static Semantics
Static Semantics: Early Errors
FunctionDeclaration
: function BindingIdentifier ( FormalParameterList ) {
FunctionBody }
and
FunctionExpression
: function BindingIdentifieropt ( FormalParameterList )
{ FunctionBody }
NOTE The LexicallyDeclaredNames of a FunctionBody does not include identifiers bound using var or function declarations. Simple parameter lists bind identifiers as VarDeclaredNames. Parameter lists that contain destructuring patterns, default value initialisers, or a rest parameter bind identifiers as LexicallyDeclaredNames. Multiple occurrences of the same Identifier in a FormalParamterList is only allowed for non-strict functions with simple parameter lists.
FunctionBody : StatementList
FormalParameter : BindingElement
Static Semantics: BoundNames
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FormalParameterList : [empty]
FormalParameterList : FormalsList , FunctionRestParameter
FormalsList : FormalsList , FormalParameter
Static Semantics: Contains
With parameter symbol.
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FunctionExpression : function BindingIdentifieropt ( FormalParameterList ) { FunctionBody }
NOTE Static semantic rules that depend upon substructure generally do not look into function definitions.
Static Semantics: ExpectedArgumentCount
FormalParameterList :
[empty]
FunctionRestParameter
FormalParameterList :
FormalsList ,
FunctionRestParameter
NOTE The ExpectedArgumentCount of a FormalParameterList is the number of FormalParameters to the left of either the rest parameter or the first FormalParameter with an Initialiser. A FormalParameter without an initializer is allowed after the first parameter with an initializer but such parameters are considered to be optional with undefined as their default value.
FormalsList : FormalParameter
FormalsList : FormalsList, FormalParameter
Static Semantics: HasInitialiser
FormalsList : FormalsList , FormalParameter
Static Semantics: IsConstantDeclaration
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
Static Semantics: IsSimpleParameterList
FormalParameterList : [empty]
FormalParameterList : FunctionRestParameter
FormalParameterList : FormalsList , FunctionRestParameter
FormalsList : FormalsList , FormalParameter
FormalParameter : BindingElement
Static Semantics: IsStrict
FunctionBody : StatementListopt
Static Semantics: LexicallyDeclaredNames
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FunctionBody : [empty]
FunctionBody : StatementList
Static Semantics: VarDeclaredNames
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FunctionBody : [empty]
FunctionBody : StatementList
Runtime Semantics
Runtime Semantics: Binding Initialisation
With parameters value and environment.
NOTE When undefined is passed for environment it indicates that a PutValue operation should be used to assign the initialisation value. This is the case for formal parameter lists of non-strict functions. In that case the formal parameter bindings are preinitialized in order to deal with the possibility of multiple parameters with the same name.
FormalParameterList : [empty]
FormalParameterList : FunctionRestParameter
FormalParameterList : FormalsList
FormalParameterList : FormalsList , FunctionRestParameter
Runtime Semantics: Indexed Binding Initialisation
With parameters array, nextIndex, and environment.
FormalsList : FormalParameter
FormalsList : FormalsList , FormalParameter
FunctionRestParameter : ... BindingIdentifier
Runtime Semantics: InstantiateFunctionObject
With parameter scope.
FunctionDeclaration : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
Runtime Semantics: Evaluation
FunctionDeclaration
: function BindingIdentifier ( FormalParameterList ) { FunctionBody }
FunctionExpression
: function (
FormalParameterList ) { FunctionBody }
FunctionExpression : function BindingIdentifier ( FormalParameterList ) { FunctionBody }
NOTE 1 The BindingIdentifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the BindingIdentifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.
NOTE 2 A prototype property is automatically created for every function defined using a FunctionDeclaration or FunctionExpression, to allow for the possibility that the function will be used as a constructor.
FunctionBody : StatementListopt
13.2 Arrow Function Definitions
Syntax
ArrowFunction :
ArrowParameters => ConciseBody
ArrowParameters :
BindingIdentifier
CoverParenthesizedExpressionAndArrowParameterList
ConciseBody :
[lookahead ∉ { { }] AssignmentExpression
{ FunctionBody }
Supplemental Syntax
When processing the production ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList the following grammar is used to refine the interpretation of CoverParenthesizedExpressionAndArrowParameterList.
ArrowFormalParameterList :
( FormalParameterList )
Static Semantics
Static Semantics: Early Errors
ArrowFunction : ArrowParameters => ConciseBody
ArrowParameters : BindingIdentifier
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
Static Semantics: BoundNames
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
Static Semantics: Contains
With parameter symbol.
ArrowFunction : ArrowParameters => ConciseBody
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
NOTE Contains is used to detect yield and super usage within an ArrowFunction.
Static Semantics: CoveredFormalsList
CoverParenthesizedExpressionAndArrowParameterList:
( Expression
)
( )
( ... Identifier )
(
Expression , ... Identifier)
Static Semantics: ExpectedArgumentCount
ArrowParameters : BindingIdentifier
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
Static Semantics: IsSimpleParameterList
ArrowParameters : BindingIdentifier
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
Static Semantics: LexicallyDeclaredNames
ConciseBody : [lookahead ∉ { { }] AssignmentExpression
∉
Runtime Semantics
Runtime Semantics: Binding Initialisation
With parameters value and environment.
NOTE When undefined is passed for environment it indicates that a PutValue operation should be used to assign the initialisation value. This is the case for formal parameter lists of non-strict functions. In that case the formal parameter bindings are preinitialized in order to deal with the possibility of multiple parameters with the same name.
ArrowParameters : BindingIdentifier
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
Runtime Semantics: Evaluation
ArrowFunction : ArrowParameters => ConciseBody
ConciseBody : [lookahead ∉ { { }] AssignmentExpression
13.3 Method Definitions
Syntax
MethodDefinition :
PropertyName (
FormalParameterList ) { FunctionBody }
* PropertyName (
FormalParameterList ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList
) { FunctionBody }
PropertySetParameterList :
BindingIdentifier
BindingPattern
NOTE The single element of a PropertySetParameterList may not have a default value Initialiser because set accessor are always called with an implicitly provided argument.
Static Semantics
Static Semantics: Early Errors
MethodDefinition : PropertyName ( FormalParameterList ) { FunctionBody }
and
MethodDefinition : * PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition : PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition : * PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition : get PropertyName ( ) { FunctionBody }
MethodDefinition : set PropertyName ( PropertySetParameterList ) { FunctionBody }
Static Semantics: ExpectedArgumentCount
PropertySetParameterList : BindingIdentifier
PropertySetParameterList : BindingPattern
Static Semantics: IsSimpleParameterList
PropertySetParameterList : BindingIdentifier
PropertySetParameterList : BindingPattern
Static Semantics: PropName
MethodDefinition :
PropertyName (
FormalParameterList ) { FunctionBody }
* PropertyName (
FormalParameterList ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList
) { FunctionBody }
Static Semantics: ReferencesSuper
MethodDefinition :
PropertyName (
FormalParameterList ) { FunctionBody }
* PropertyName (
FormalParameterList ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList
) { FunctionBody }
Static Semantics: SpecialMethod
MethodDefinition : PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition :
* PropertyName
( FormalParameterList ) { FunctionBody }
get
PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList
) { FunctionBody }
Runtime Semantics
Runtime Semantics: Property Definition Evaluation
With parameter object.
MethodDefinition : PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition : * PropertyName ( FormalParameterList ) { FunctionBody }
MethodDefinition : get PropertyName ( ) { FunctionBody }
MethodDefinition : set PropertyName ( PropertySetParameterList ) { FunctionBody }
13.4 Generator Definitions
Syntax
GeneratorDeclaration :
function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
GeneratorExpression :
function * BindingIdentifieropt ( FormalParameterList ) { FunctionBody }
YieldExpression :
yield YieldDelegatoropt [Lexical goal InputElementRegExp] AssignmentExpression
YieldDelegator :
*
Static Semantics
Static Semantics: Early Errors
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList
) { FunctionBody }
and
GeneratorExpression : function * BindingIdentifieropt ( FormalParameterList ) { FunctionBody }
YieldExpression : yield YieldDelegatoropt AssignmentExpression
Static Semantics: BoundNames
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
Static Semantics: Contains
With parameter symbol.
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
GeneratorExpression : function * BindingIdentifieropt ( FormalParameterList ) { FunctionBody }
NOTE Static semantic rules that depend upon substructure generally do not look into function definitions.
Static Semantics: IsConstantDeclaration
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
Static Semantics: LexicallyDeclaredNames
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
Static Semantics: VarDeclaredNames
GeneratorDeclaration : function * BindingIdentifier ( FormalParameterList ) { FunctionBody }
Runtime Semantics
13.5 Class Definitions
Syntax
ClassDeclaration:
class BindingIdentifier ClassTail
ClassExpression :
class BindingIdentifieropt ClassTail
ClassTail :
ClassHeritageopt { ClassBodyopt }
ClassHeritage:
extends AssignmentExpression
ClassBody :
ClassElementList
ClassElementList :
ClassElement
ClassElementList ClassElement
ClassElement :
MethodDefinition
;
Static Semantics
Static Semantics: Early Errors
ClassDeclaration : class BindingIdentifier ClassTail
and
ClassExpression : class BindingIdentifier ClassTail
ClassBody : ClassElementList
ClassElement : MethodDefinition
Static Semantics: BoundNames
ClassDeclaration: class BindingIdentifier ClassTail
Static Semantics: ConstructorMethod
ClassBody : ClassElementList
NOTE Early Error rules ensure that there is only one method definition named ″constructor″ and that it isn’t an accessor property or generator definition.
Static Semantics: Contains
With parameter symbol.
ClassTail : ClassHeritageopt { ClassBody }
NOTE Static semantic rules that depend upon substructure generally do not look into class bodies.
Static Semantics: IsConstantDeclaration
ClassDeclaration: class BindingIdentifier ClassTail
Static Semantics: LexicallyDeclaredNames
ClassDeclaration: class BindingIdentifier ClassTail
Static Semantics: MethodDefinitions
ClassElementList : ClassElement
ClassElementList : ClassElementList ClassElement
Static Semantics: PropName
ClassElement : ;
Static Semantics: PropertyNameList
ClassElementList : ClassElement
ClassElementList : ClassElementList ClassElement
Static Semantics: VarDeclaredNames
ClassDeclaration: class BindingIdentifier ClassTail
Runtime Semantics
Runtime Semantics: ClassDefinitionEvaluation
With parameter className.
ClassTail : ClassHeritageopt { ClassBody }
Runtime Semantics: Evaluation
ClassDeclaration: class BindingIdentifier ClassTail
NOTE The argument to ClassDefinitionEvaluation controls whether or not the class that is defined with a BindingIdentifier has a local binding to the identifier. Only a ClassExpression gets a local name binding of its name. A ClassDeclaration never has such a binding. This maintains the parallel with FunctionExpression and FunctionDeclaration.
ClassExpression: class BindingIdentifieropt ClassTail
13.6 Creating Function Objects and Constructors
Runtime Semantics: FunctionCreate Abstract Operation
The abstract operation FunctionCreate requires the arguments: kind which is one of (Normal, Method, Arrow), an parameter list specified by ParameterList, a body specified by Body, a Lexical Environment specified by Scope, a Boolean flag Strict, and optionally, an object functionPrototype, an object homeObject and a string methodName. FunctionCreate performs the following steps:
Runtime Semantics: MakeConstructor Abstract Operation
The abstract operation MakeConstructor requires a Function argument F and optionally, a Boolean writablePrototype and an object prototype. If prototype is provided it is assume to already contain a "constructor" whose value is F. It converts F into a constructor by performs the following steps:
13.6.3 The [[ThrowTypeError]] Function Object
The [[ThrowTypeError]] object is a unique function object that is defined once as follows:
Runtime Semantics: AddRestrictedFunctionProperties Abstract Operation
The abstract operation is called with a function object F as its argument. It performs the following steps:
13.7 Tail Position Calls
The wiki proposal has a preliminary attempt at defining tail position. See http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls.
This material still needs to be reviewed and updated for incorporation here.
14 Scripts and Modules
14.1 Script
Syntax
Script :
ScriptBodyopt
ScriptBody :
Outer
StatementList
OuterStatementList :
OuterItem
OuterStatementList OuterItem
OuterItem :
ModuleDeclaration
ImportDeclaration
StatementListItem
Static Semantics
Static Semantics: Early Errors
ScriptBody : OuterStatementList
NOTE Additional error conditions relating to conflicting or duplicate declarations are checked during module linking prior to evaluation of a Script. If any such errors are detected the Script is not evaluated.
Static Semantics: IsStrict
ScriptBody : OuterStatementList
Static Semantics: LexicallyDeclaredNames
OuterStatementList : OuterStatementList OuterItem
OuterItem : ModuleDeclaration
OuterItem : ImportDeclaration
OuterItem : StatementListItem
NOTE At the top level of a Script, function declarations are treated like var declarations rather than like lexical declarations.
Static Semantics: LexicallyScopedDeclarations
OuterStatementList : OuterStatementList OuterItem
OuterItem : ModuleDeclaration
OuterItem : ImportDeclaration
OuterItem : StatementListItem
Static Semantics: VarDeclaredNames
OuterStatementList : OuterStatementList OuterItem
OuterItem : ModuleDeclaration
OuterItem : ImportDeclaration
OuterItem : StatementListItem
Static Semantics: VarScopedDeclarations
OuterStatementList : OuterStatementList OuterItem
OuterItem : ModuleDeclaration
OuterItem : ImportDeclaration
OuterItem : StatementListItem
Runtime Semantics
Runtime Semantics: Script Evaluation
With argument realm and deletableBindings.
Script : ScriptBodyopt
NOTE The processes for initiating the evaluation of a Script and for dealing with the result of such an evaluation are defined by an ECMAScript implementation and not by this specification.
Runtime Semantics: Evaluation
OuterStatementList : OuterStatementList OuterItem
NOTE See the 12.1 NOTE regarding evaluation of StatementList : StatementList StatementListItem.
14.1.1 Directive Prologues and the Use Strict Directive
A Directive Prologue is the longest sequence of ExpressionStatement productions occurring as the initial StatementListItem productions of a ScriptBody or FunctionBody and where each ExpressionStatement in the sequence consists entirely of a StringLiteral token followed by a semicolon. The semicolon may appear explicitly or may be inserted by automatic semicolon insertion. A Directive Prologue may be an empty sequence.
A Use Strict Directive is an ExpressionStatement in a Directive Prologue whose StringLiteral is either the exact character sequences "use strict" or 'use strict'. A Use Strict Directive may not contain an EscapeSequence or LineContinuation.
A Directive Prologue may contain more than one Use Strict Directive. However, an implementation may issue a warning if this occurs.
NOTE The ExpressionStatement productions of a Directive Prologue are evaluated normally during evaluation of the containing production. Implementations may define implementation specific meanings for ExpressionStatement productions which are not a Use Strict Directive and which occur in a Directive Prologue. If an appropriate notification mechanism exists, an implementation should issue a warning if it encounters in a Directive Prologue an ExpressionStatement that is not a Use Strict Directive or which does not have a meaning defined by the implementation.
14.2 Modules
15 Standard Built-in ECMAScript Objects
There are certain built-in objects available whenever an ECMAScript program begins execution. One, the global object, is part of the lexical environment of the executing program. Others are accessible as initial properties of the global object.
Unless specified otherwise, a built-in object has the [[BuiltinBrand]] internal data property with value BuiltinFunction if that built-in object has a [[Call]] internal method. Unless specified otherwise, the [[Extensible]] internal data property of a built-in object initially has the value true.
Many built-in objects are functions: they can be invoked with arguments. Some of them furthermore are constructors: they are functions intended for use with the new operator. For each built-in function, this specification describes the arguments required by that function and properties of the Function object. For each built-in constructor, this specification furthermore describes properties of the prototype object of that constructor and properties of specific object instances returned by a new expression that invokes that constructor.
Unless otherwise specified in the description of a particular function, if a function or constructor described in this clause is given fewer arguments than the function is specified to require, the function or constructor shall behave exactly as if it had been given sufficient additional arguments, each such argument being the undefined value.
Unless otherwise specified in the description of a particular function, if a function or constructor described in this clause is given more arguments than the function is specified to allow, the extra arguments are evaluated by the call and then ignored by the function. However, an implementation may define implementation specific behaviour relating to such arguments as long as the behaviour is not the throwing of a TypeError exception that is predicated simply on the presence of an extra argument.
NOTE Implementations that add additional capabilities to the set of built-in functions are encouraged to do so by adding new functions rather than adding new parameters to existing functions.
Every built-in function and every built-in constructor has the Function prototype object, which is the initial value of the expression Function.prototype (15.3.4), as the value of its [[Prototype]] internal data property.
Unless otherwise specified every built-in prototype object has the Object prototype object, which is the initial value of the expression Object.prototype (15.2.4), as the value of its [[Prototype]] internal data property, except the Object prototype object itself.
None of the built-in functions described in this clause that are not constructors shall implement the [[Construct]] internal method unless otherwise specified in the description of a particular function. The behavior specified in this clause for each built-in function is the specification of the [[Call]] internal method behavior for that function. None of the built-in functions described in this clause shall have a prototype property unless otherwise specified in the description of a particular function.
This clause generally describes distinct behaviours for when a constructor is “called as a function” and for when it is “called as part of a new expression”. The “called as a function” behaviour corresponds to the invocation of the constructor’s [[Call]] internal method and the “called as part of a new expression” behaviour corresponds to the invocation of the constructor’s [[Construct]] internal method.
Every built-in Function object, F, described in this clause—whether as a constructor, an ordinary function, or both—has the properties that are defined by performing the following step when the function object is created:
1. Perform the AddRestrictedFunctionProperties (13.6.3) abstract operation with argument F.
Every built-in Function object described in this clause—whether as a constructor, an ordinary function, or both—has a length property whose value is an integer. Unless otherwise specified, this value is equal to the largest number of named arguments shown in the subclause headings for the function description, including optional parameters.
NOTE For example, the Function object that is the initial value of the slice property of the String prototype object is described under the subclause heading “String.prototype.slice (start, end)” which shows the two named arguments start and end; therefore the value of the length property of that Function object is 2.
In every case, the length property of a built-in Function object described in this clause has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Every other data property described in this clause has the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } unless otherwise specified.
Every accessor property described in this clause has the attributes {[[Enumerable]]: false, [[Configurable]]: true } unless otherwise specified. If only a get accessor function is described, the set accessor function is the default value, undefined. If only a set accessor is function is described the get accessor is the default value, undefined.
15.1 The Global Object
The unique global object is created before control enters any execution context.
Unless otherwise specified, the standard built-in properties of the global object have attributes {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.
The global object does not have a [[Construct]] internal method; it is not possible to use the global object as a constructor with the new operator.
The global object does not have a [[Call]] internal method; it is not possible to invoke the global object as a function.
The value of the [[Prototype]] internal data property of the global object is implementation-dependent.
In addition to the properties defined in this specification the global object may have additional host defined properties. This may include a property whose value is the global object itself; for example, in the HTML document object model the window property of the global object is the global object itself.
15.1.1 Value Properties of the Global Object
15.1.1.1 NaN
The value of NaN is NaN (see 8.5). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.1.1.2 Infinity
The value of Infinity is +∞ (see 8.5). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.1.2 Function Properties of the Global Object
15.1.2.1 eval (x)
When the eval function is called with one argument x, the following steps are taken:
NOTE The eval code cannot instantiate variable or function bindings in the variable environment of the calling context that invoked the eval if either the code of the calling context or the eval code is strict code. Instead such bindings are instantiated in a new VariableEnvironment that is only accessible to the eval code.
15.1.2.1.1 Direct Call to Eval
A direct call to the eval function is one that is expressed as a CallExpression that meets the following two conditions:
The Reference that is the result of evaluating the MemberExpression in the CallExpression has an environment record as its base value and its reference name is "eval".
The result of calling the abstract operation GetValue with that Reference as the argument is the standard built-in function defined in 15.1.2.1.
15.1.2.2 parseInt (string , radix)
The parseInt function produces an integer value dictated by interpretation of the contents of the string argument according to the specified radix. Leading white space in string is ignored. If radix is undefined or 0, it is assumed to be 10 except when the number begins with the character pairs 0x or 0X, in which case a radix of 16 is assumed. If radix is 16, the number may also optionally begin with the character pairs 0x or 0X.
When the parseInt function is called, the following steps are taken:
NOTE parseInt may interpret only a leading portion of string as an integer value; it ignores any characters that cannot be interpreted as part of the notation of an integer, and no indication is given that any such characters were ignored.
15.1.2.3 parseFloat (string)
The parseFloat function produces a Number value dictated by interpretation of the contents of the string argument as a decimal literal.
When the parseFloat function is called, the following steps are taken:
NOTE parseFloat may interpret only a leading portion of string as a Number value; it ignores any characters that cannot be interpreted as part of the notation of an decimal literal, and no indication is given that any such characters were ignored.
15.1.2.4 isNaN (number)
Returns true if the argument coerces to NaN, and otherwise returns false.
NOTE A reliable way for ECMAScript code to test if a value X is a NaN is an expression of the form X !== X. The result will be true if and only if X is a NaN.
15.1.2.5 isFinite (number)
Returns false if the argument coerces to NaN, +∞, or −∞, and otherwise returns true.
15.1.3 URI Handling Function Properties
Uniform Resource Identifiers, or URIs, are Strings that identify resources (e.g. web pages or files) and transport protocols by which to access them (e.g. HTTP or FTP) on the Internet. The ECMAScript language itself does not provide any support for using URIs except for functions that encode and decode URIs as described in 15.1.3.1, 15.1.3.2, 15.1.3.3 and 15.1.3.4.
NOTE Many implementations of ECMAScript provide additional functions and methods that manipulate web pages; these functions are beyond the scope of this standard.
A URI is composed of a sequence of components separated by component separators. The general form is:
Scheme : First / Second ; Third ? Fourth
where the italicised names represent components and “:”, “/”, “;” and “?” are reserved characters used as separators. The encodeURI and decodeURI functions are intended to work with complete URIs; they assume that any reserved characters in the URI are intended to have special meaning and so are not encoded. The encodeURIComponent and decodeURIComponent functions are intended to work with the individual component parts of a URI; they assume that any reserved characters represent text and so must be encoded so that they are not interpreted as reserved characters when the component is part of a complete URI.
The following lexical grammar specifies the form of encoded URIs.
Syntax
uri :::
uriCharactersopt
uriCharacters :::
uriCharacter uriCharactersopt
uriCharacter :::
uriReserved
uriUnescaped
uriEscaped
uriReserved ::: one of
; / ? : @ & = + $ ,
uriUnescaped :::
uriAlpha
DecimalDigit
uriMark
uriEscaped :::
% HexDigit HexDigit
uriAlpha ::: one of
a b c d e f g h
i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
uriMark ::: one of
- _ . ! ~ * ' ( )
NOTE The above syntax is based upon RFC 2396 and does not reflect changes introduced by the more recent RFC 3986.
Runtime Semantics
When a character to be included in a URI is not listed above or is not intended to have the special meaning sometimes given to the reserved characters, that character must be encoded. The character is transformed into its UTF-8 encoding, with surrogate pairs first converted from UTF-16 to the corresponding code point value. (Note that for code units in the range [0,127] this results in a single octet with the same value.) The resulting sequence of octets is then transformed into a String with each octet represented by an escape sequence of the form “%xx”.
Runtime Semantics: Encode Abstract Operation
The encoding and escaping process is described by the abstract operation Encode taking two String arguments string and unescapedSet.
Runtime Semantics: Decode Abstract Operation
The unescaping and decoding process is described by the abstract operation Decode taking two String arguments string and reservedSet.
NOTE This syntax of Uniform Resource Identifiers is based upon RFC 2396 and does not reflect the more recent RFC 3986 which replaces RFC 2396. A formal description and implementation of UTF-8 is given in RFC 3629.
In UTF-8, characters are encoded using sequences of 1 to 6 octets. The only octet of a "sequence" of one has the higher-order bit set to 0, the remaining 7 bits being used to encode the character value. In a sequence of n octets, n>1, the initial octet has the n higher-order bits set to 1, followed by a bit set to 0. The remaining bits of that octet contain bits from the value of the character to be encoded. The following octets all have the higher-order bit set to 1 and the following bit set to 0, leaving 6 bits in each to contain bits from the character to be encoded. The possible UTF-8 encodings of ECMAScript characters are specified in Table 29.
Table 29 — UTF-8 Encodings
|
Code Unit Value |
Representation |
1st Octet |
2nd Octet |
3rd Octet |
4th Octet |
|
0x0000 - 0x007F |
00000000 0zzzzzzz |
0zzzzzzz |
|||
|
0x0080 - 0x07FF |
00000yyy yyzzzzzz |
110yyyyy |
10zzzzzz |
||
|
0x0800 - 0xD7FF |
xxxxyyyy yyzzzzzz |
1110xxxx |
10yyyyyy |
10zzzzzz |
|
|
0xD800 - 0xDBFF followed by 0xDC00 – 0xDFFF |
110110vv vvwwwwxx followed by 110111yy yyzzzzzz |
11110uuu |
10uuwwww |
10xxyyyy |
10zzzzzz |
|
0xD800 - 0xDBFF not followed by 0xDC00 – 0xDFFF |
causes URIError |
||||
|
0xDC00 – 0xDFFF |
causes URIError |
||||
|
0xE000 - 0xFFFF |
xxxxyyyy yyzzzzzz |
1110xxxx |
10yyyyyy |
10zzzzzz |
Where
uuuuu = vvvv + 1
to account for the addition of 0x10000 as in Surrogates, section 3.7, of the Unicode Standard.
The range of code unit values 0xD800-0xDFFF is used to encode surrogate pairs; the above transformation combines a UTF-16 surrogate pair into a UTF-32 representation and encodes the resulting 21-bit value in UTF-8. Decoding reconstructs the surrogate pair.
RFC 3629 prohibits the decoding of invalid UTF-8 octet sequences. For example, the invalid sequence C0 80 must not decode into the character U+0000. Implementations of the Decode algorithm are required to throw a URIError when encountering such invalid sequences.
15.1.3.1 decodeURI (encodedURI)
The decodeURI function computes a new version of a URI in which each escape sequence and UTF-8 encoding of the sort that might be introduced by the encodeURI function is replaced with the character that it represents. Escape sequences that could not have been introduced by encodeURI are not replaced.
When the decodeURI function is called with one argument encodedURI, the following steps are taken:
NOTE The character “#” is not decoded from escape sequences even though it is not a reserved URI character.
15.1.3.2 decodeURIComponent (encodedURIComponent)
The decodeURIComponent function computes a new version of a URI in which each escape sequence and UTF-8 encoding of the sort that might be introduced by the encodeURIComponent function is replaced with the character that it represents.
When the decodeURIComponent function is called with one argument encodedURIComponent, the following steps are taken:
15.1.3.3 encodeURI (uri)
The encodeURI function computes a new version of a URI in which each instance of certain characters is replaced by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.
When the encodeURI function is called with one argument uri, the following steps are taken:
NOTE The character “#” is not encoded to an escape sequence even though it is not a reserved or unescaped URI character.
15.1.3.4 encodeURIComponent (uriComponent)
The encodeURIComponent function computes a new version of a URI in which each instance of certain characters is replaced by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.
When the encodeURIComponent function is called with one argument uriComponent, the following steps are taken:
15.1.4 Constructor Properties of the Global Object
15.1.4.1 Object ( . . . )
See 15.2.1 and 15.2.2.
15.1.4.2 Function ( . . . )
See 15.3.1 and 15.3.2.
15.1.4.3 Array ( . . . )
See 15.4.1 and 15.4.2.
15.1.4.4 String ( . . . )
See 15.5.1 and 15.5.2.
15.1.4.5 Boolean ( . . . )
See 15.6.1 and 15.6.2.
15.1.4.6 Number ( . . . )
See 15.7.1 and 15.7.2.
15.1.4.7 Date ( . . . )
See 15.9.2.
15.1.4.8 RegExp ( . . . )
See 15.10.3 and 15.10.4.
15.1.4.9 Error ( . . . )
See 15.11.1 and 15.11.2.
15.1.4.10 EvalError ( . . . )
See 15.11.6.1.
15.1.4.11 RangeError ( . . . )
See 15.11.6.2.
15.1.4.12 ReferenceError ( . . . )
See 15.11.6.3.
15.1.4.13 SyntaxError ( . . . )
See 15.11.6.4.
15.1.4.14 TypeError ( . . . )
See 15.11.6.5.
15.1.4.15 URIError ( . . . )
See 15.11.6.6.
15.1.4.16 Map ( . . . )
See 15.14.3.
15.1.4.17 WeakMap ( . . . )
See 15.15.3.
15.1.4.18 Set ( . . . )
See 15.16.3.
15.1.5 Other Properties of the Global Object
15.1.5.1 Math
See 15.8.
15.1.5.2 JSON
See 15.12.
15.2 Object Objects
15.2.1 The Object Constructor Called as a Function
When Object is called as a function rather than as a constructor, it performs a type conversion.
15.2.1.1 Object ( [ value ] )
When the Object function is called with no arguments or with one argument value, the following steps are taken:
15.2.2 The Object Constructor
When Object is called as part of a new expression, it is a constructor that may create an object.
15.2.2.1 new Object ( [ value ] )
When the Object constructor is called with no arguments or with one argument value, the following steps are taken:
15.2.3 Properties of the Object Constructor
The value of the [[Prototype]] internal data property of the Object constructor is the standard built-in Function prototype object.
Besides the length property (whose value is 1), the Object constructor has the following properties:
15.2.3.1 Object.prototype
The initial value of Object.prototype is the standard built-in Object prototype object (15.2.4).
This property has the attributes {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.2.3.2 Object.getPrototypeOf ( O )
When the getPrototypeOf function is called with argument O, the following steps are taken:
15.2.3.3 Object.getOwnPropertyDescriptor ( O, P )
When the getOwnPropertyDescriptor function is called, the following steps are taken:
15.2.3.4 Object.getOwnPropertyNames ( O )
When the getOwnPropertyNames function is called, the following steps are taken:
15.2.3.5 Object.create ( O [, Properties] )
The create function creates a new object with a specified prototype. When the create function is called, the following steps are taken:
15.2.3.6 Object.defineProperty ( O, P, Attributes )
The defineProperty function is used to add an own property and/or update the attributes of an existing own property of an object. When the defineProperty function is called, the following steps are taken:
15.2.3.7 Object.defineProperties ( O, Properties )
The defineProperties function is used to add own properties and/or update the attributes of existing own properties of an object. When the defineProperties function is called, the following steps are taken:
Runtime Semantics: ObjectDefineProperties Abstract Operation
The abstract operation ObjectDefineProperties with arguments O and Properties performs the following steps:
If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used to order the list elements in step 3 of this algorithm.
NOTE An exception in defining an individual property in step 7 does not terminate the process of defining other properties. All valid property definitions are processed.
15.2.3.8 Object.seal ( O )
When the seal function is called, the following steps are taken:
15.2.3.9 Object.freeze ( O )
When the freeze function is called, the following steps are taken:
15.2.3.10 Object.preventExtensions ( O )
When the preventExtensions function is called, the following steps are taken:
15.2.3.11 Object.isSealed ( O )
When the isSealed function is called with argument O, the following steps are taken:
15.2.3.12 Object.isFrozen ( O )
When the isFrozen function is called with argument O, the following steps are taken:
15.2.3.13 Object.isExtensible ( O )
When the isExtensible function is called with argument O, the following steps are taken:
15.2.3.14 Object.keys ( O )
When the keys function is called with argument O, the following steps are taken:
15.2.3.15 Object.assign ( target, source )
TODO :
15.2.4 Properties of the Object Prototype Object
The value of the [[Prototype]] internal data property of the Object prototype object is null and the initial value of the [[Extensible]] internal data property is true.
15.2.4.1 Object.prototype.constructor
The initial value of Object.prototype.constructor is the standard built-in Object constructor.
15.2.4.2 Object.prototype.toString ( )
When the toString method is called, the following steps are taken:
Table 30 — [[BuiltinBrand]] Tag Values
|
[[BuiltinBrand]] Value |
tag Value |
|
BuiltinFunction |
"Function" |
|
BuiltinArray |
"Array" |
|
BuiltinStringWrapper |
"String" |
|
BuiltinBooleanWrapper |
"Boolean" |
|
BuiltinNumberWrapper |
"Number" |
|
BuiltinMath |
"Math" |
|
BuiltinDate |
"Date" |
|
BuiltinRegExp |
"RegExp" |
|
BuiltinError |
"Error" |
|
BuiltinJSON |
"JSON" |
|
BuiltinArguments |
"Arguments" |
NOTE Historically, this function was occasionally used to access the string value of the [[Class]] internal data property that was used in previous editions of this specification as a nominal type tag for various built-in objects. This definition of toString preserves the ability to use it as a reliable test for those specific kinds of built-in objects but it does not provide a reliable type testing mechanism for other kinds of built-in or program defined objects.
15.2.4.3 Object.prototype.toLocaleString ( )
When the toLocaleString method is called, the following steps are taken:
NOTE 1 This function is provided to give all Objects a generic toLocaleString interface, even though not all may use it. Currently, Array, Number, and Date provide their own locale-sensitive toLocaleString methods.
NOTE 2 The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
15.2.4.4 Object.prototype.valueOf ( )
When the valueOf method is called, the following steps are taken:
15.2.4.5 Object.prototype.hasOwnProperty (V)
When the hasOwnProperty method is called with argument V, the following steps are taken:
NOTE The ordering of steps 1 and 3 is chosen to ensure that any exception that would have been thrown by step 1 in previous editions of this specification will continue to be thrown even if the this value is undefined or null.
15.2.4.6 Object.prototype.isPrototypeOf (V)
When the isPrototypeOf method is called with argument V, the following steps are taken:
NOTE The ordering of steps 1 and 2 is chosen to preserve the behaviour specified by previous editions of this specification for the case where V is not an object and the this value is undefined or null.
15.2.4.7 Object.prototype.propertyIsEnumerable (V)
When the propertyIsEnumerable method is called with argument V, the following steps are taken:
NOTE 1 This method does not consider objects in the prototype chain.
NOTE 2 The ordering of steps 1 and 2 is chosen to ensure that any exception that would have been thrown by step 1 in previous editions of this specification will continue to be thrown even if the this value is undefined or null.
15.2.5 Properties of Object Instances
Object instances have no special properties beyond those inherited from the Object prototype object.
15.3 Function Objects
15.3.1 The Function Constructor Called as a Function
When Function is called as a function rather than as a constructor, it creates and initialises a new Function object. Thus the function call Function(…) is equivalent to the object creation expression new Function(…) with the same arguments.
15.3.1.1 Function (p1, p2, … , pn, body)
When the Function function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there are no “p” arguments, and where body might also not be provided), the following steps are taken:
15.3.2 The Function Constructor
When Function is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.3.2.1 new Function (p1, p2, … , pn, body)
The last argument specifies the body (executable code) of a function; any preceding arguments specify formal parameters.
When the Function constructor is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there are no “p” arguments, and where body might also not be provided), the following steps are taken:
A prototype property is automatically created for every function, to provide for the possibility that the function will be used as a constructor.
NOTE It is permissible but not necessary to have one argument for each formal parameter to be specified. For example, all three of the following expressions produce the same result:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
15.3.3 Properties of the Function Constructor
The Function constructor is itself a Function object and has a [[BuiltinBrand]] internal data property whose value is BuiltinFunction. The value of the [[Prototype]] internal data property of the Function constructor is the standard built-in Function prototype object (15.3.4).
The value of the [[Extensible]] internal data property of the Function constructor is true.
The Function constructor has the following properties:
15.3.3.1 Function.prototype
The initial value of Function.prototype is the standard built-in Function prototype object (15.3.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.3.3.2 Function.length
This is a data property with a value of 1. This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.3.4 Properties of the Function Prototype Object
The Function prototype object is itself a Function object and has a [[BuiltinBrand]] internal data property whose value is BuiltinFunction . When invoked, it accepts any arguments and returns undefined.
The value of the [[Prototype]] internal data property of the Function prototype object is the standard built-in Object prototype object (15.2.4). The initial value of the [[Extensible]] internal data property of the Function prototype object is true.
The function prototype object does not have a prototype property.
The Function prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype Object.
The length property of the Function prototype object is 0.
15.3.4.1 Function.prototype.constructor
The initial value of Function.prototype.constructor is the built-in Function constructor.
15.3.4.2 Function.prototype.toString ( )
An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration. Note in particular that the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.
The toString function is not generic; it throws a TypeError exception if its this value is not a Function object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
15.3.4.3 Function.prototype.apply (thisArg, argArray)
When the apply method is called on an object func with arguments thisArg and argArray, the following steps are taken:
The length property of the apply method is 2.
NOTE The thisArg value is passed without modification as the this value. This is a change from Edition 3, where a undefined or null thisArg is replaced with the global object and ToObject is applied to all other values and that result is passed as the this value.
15.3.4.4 Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
When the call method is called on an object func with argument thisArg and optional arguments arg1, arg2 etc, the following steps are taken:
The length property of the call method is 1.
NOTE The thisArg value is passed without modification as the this value. This is a change from Edition 3, where a undefined or null thisArg is replaced with the global object and ToObject is applied to all other values and that result is passed as the this value.
15.3.4.5 Function.prototype.bind (thisArg [, arg1 [, arg2, …]])
The bind method takes one or more arguments, thisArg and (optionally) arg1, arg2, etc, and returns a new function object by performing the following steps:
The length property of the bind method is 1.
NOTE Function objects created using Function.prototype.bind are exotic objects. They also do not have a prototype property.
15.3.4.6 @@hasInstance (V)
When the @@hasInstance method of an object F is called with value V, the following steps are taken:
15.3.5 Properties of Function Instances
In addition to the required internal properties, every function instance has a [[Call]] internal method and in most cases uses a different version of the [[Get]] internal method. Depending on how they are created (see 8.6.2, 13.6, 15, and 15.3.4.5), function instances may have a [[Scope]] internal data property, a [[Construct]] internal method, a [[FormalParameters]] internal data property, a [[Code]] internal data property, a [[BoundTargetFunction]] internal data property, a [[BoundThis]] internal data property, and a [[BoundArguments]] internal data property.
Every function instance has a [[BuiltinBrand]] internal data property whose value is BuiltinFunction.
Function instances that correspond to strict mode functions (13.6) and function instances created using the Function.prototype.bind method (15.3.4.5) have properties named “caller” and “arguments” that throw a TypeError exception. An ECMAScript implementation must not associate any implementation specific behaviour with accesses of these properties from strict mode function code.
15.3.5.1 length
The value of the length property is an integer that indicates the “typical” number of arguments expected by the function. However, the language permits the function to be invoked with some other number of arguments. The behaviour of a function when invoked on a number of arguments other than the number specified by its length property depends on the function. This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.3.5.2 prototype
The value of the prototype property is used to initialise the [[Prototype]] internal data property of a newly created ordinay object before the Function object is invoked as a constructor for that newly created object. This property has the attribute { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE Function objects created using Function.prototype.bind do not have a prototype property.
15.4 Array Objects
Array objects are exotic objects that give special treatment to a certain class of property names. See 8.4.2 for a definition of this special treatment.
−
An Array object, O, is said to be sparse if the following algorithm returns true:
Runtime Semantics: ArrayCreate Abstract Operation
The abstract operation ArrayCreate with argument length (a positive integer) is used to specify the creation of new Array objects. It performs the following steps:
15.4.1 The Array Constructor Called as a Function
NOTE When Array is called as a function rather than as a constructor, it creates and initialises a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments.
15.4.1.1 Array ( [ item1 [ , item2 [ , … ] ] ] )
When the Array function is called the following steps are taken:
15.4.2 The Array Constructor
NOTE When Array is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.4.2.1 new Array ( [ item0 [ , item1 [ , … ] ] ] )
This description applies if and only if the Array constructor is given no arguments or at least two arguments.
15.4.2.2 new Array (len)
This description applies if and only if the Array constructor is given exactly one argument.
15.4.3 Properties of the Array Constructor
The value of the [[Prototype]] internal data property of the Array constructor is the Function prototype object (15.3.4).
Besides and the length property (whose value is 1), the Array constructor has the following properties:
15.4.3.1 Array.prototype
The initial value of Array.prototype is the Array prototype object (15.4.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.4.3.2 Array.isArray ( arg )
The isArray function takes one argument arg, and returns the Boolean value true if the argument is an object whose [[BuiltinBrand]] internal property is BuildinArray; otherwise it returns false. The following steps are taken:
15.4.3.3 Array.of ( …items )
When the of method is called with any number of arguments, the following steps are taken:
The length property of the of method is 0.
NOTE 1 The items argument is assume to be a well-formed rest argument value.
NOTE 2 The of function is an intentionally generic factory method; it does not require that its this value be the Array constructor. Therefore it can be transferred to or inherited by other constructors that may be called with a single numeric argument.
15.4.3.4 Array.from ( arrayLike )
When the from method is called with argument arrayLike, the following steps are taken:
NOTE The from function is an intentionally generic factory method; it does not require that its this value be the Array constructor. Therefore it can be transferred to or inherited by any other constructors that may be called with a single numeric argument.
15.4.4 Properties of the Array Prototype Object
The value of the [[Prototype]] internal data property of the Array prototype object is the standard built-in Object prototype object (15.2.4).
The Array prototype object is itself an array; it has an [[BuiltinBrand]] internal data property with value BuiltinArray, and it has a length property (whose initial value is +0) and the special [[DefineOwnProperty]] internal method described in 15.4.5.1.
In following descriptions of functions that are properties of the Array prototype object, the phrase “this object” refers to the object that is the this value for the invocation of the function. It is permitted for the this to be an object which does not have an [[BuiltinBrand]] internal data property with value BuiltinArray.
NOTE The Array prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the standard built-in Object prototype Object.
15.4.4.1 Array.prototype.constructor
The initial value of Array.prototype.constructor is the standard built-in Array constructor.
15.4.4.2 Array.prototype.toString ( )
When the toString method is called, the following steps are taken:
NOTE The toString function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the toString function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.3 Array.prototype.toLocaleString ( )
The elements of the array are converted to Strings using their toLocaleString methods, and these Strings are then concatenated, separated by occurrences of a separator String that has been derived in an implementation-defined locale-specific way. The result of calling this function is intended to be analogous to the result of toString, except that the result of this function is intended to be locale-specific.
The result is calculated as follows:
NOTE 1 The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
NOTE 2 The toLocaleString function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the toLocaleString function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.4 Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )
When the concat method is called with zero or more arguments item1, item2, etc., it returns an array containing the array elements of the object followed by the array elements of each argument in order.
The following steps are taken:
The length property of the concat method is 1.
NOTE 1 The explicit setting of the length property in step 7 is necessary to ensure that its value is correct in situations where the trailing elements of the result Array are not present.
NOTE 2 The concat function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the concat function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.5 Array.prototype.join (separator)
The elements of the array are converted to Strings, and these Strings are then concatenated, separated by occurrences of the separator. If no separator is provided, a single comma is used as the separator.
The join method takes one argument, separator, and performs the following steps:
The length property of the join method is 1.
NOTE The join function is intentionally generic; it does not require that its this value be an Array object. Therefore, it can be transferred to other kinds of objects for use as a method. Whether the join function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.6 Array.prototype.pop ( )
The last element of the array is removed from the array and returned.
NOTE The pop function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the pop function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.7 Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
The arguments are appended to the end of the array, in the order in which they appear. The new length of the array is returned as the result of the call.
When the push method is called with zero or more arguments item1, item2, etc., the following steps are taken:
The length property of the push method is 1.
NOTE The push function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the push function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.8 Array.prototype.reverse ( )
The elements of the array are rearranged so as to reverse their order. The object is returned as the result of the call.
NOTE The reverse function is intentionally generic; it does not require that its this value be an Array object. Therefore, it can be transferred to other kinds of objects for use as a method. Whether the reverse function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.9 Array.prototype.shift ( )
The first element of the array is removed from the array and returned.
NOTE The shift function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the shift function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.10 Array.prototype.slice (start, end)
The slice method takes two arguments, start and end, and returns an array containing the elements of the array from element start up to, but not including, element end (or through the end of the array if end is undefined). If start is negative, it is treated as length+start where length is the length of the array. If end is negative, it is treated as length+end where length is the length of the array. The following steps are taken:
The length property of the slice method is 2.
NOTE 1 The explicit setting of the length property of the result Array in step 15 is necessary to ensure that its value is correct in situations where the trailing elements of the result Array are not present.
NOTE 2 The slice function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the slice function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.11 Array.prototype.sort (comparefn)
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order). If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
Let obj be the result of calling ToObject passing the this value as the argument.
Let len be the result of applying Uint32 to the result of Get(O, "length").
If comparefn is not undefined and is not a consistent comparison function for the elements of this array (see below), the behaviour of sort is implementation-defined.
Let proto be the result of calling the [[GetInheritence]] internal method of obj. If proto is not null and there exists an integer j such that all of the conditions below are satisfied then the behaviour of sort is implementation-defined:
The behaviour of sort is also implementation defined if obj is sparse and any of the following conditions are true:
The behaviour of sort is also implementation defined if any array index property of obj whose name is a nonnegative integer less than len is an accessor property or is a data property whose [[Writable]] attribute is false.
Otherwise, the following steps are taken.
The returned object must have the following two properties.
Here the notation old[j] is used to refer to the hypothetical result of calling the [[GetP]] internal method of obj with argument j before this function is executed, and the notation new[j] to refer to the hypothetical result of calling the [[GetP]] internal method of obj with argument j after this function has been executed.
A function comparefn is a consistent comparison function for a set of values S if all of the requirements below are met for all values a, b, and c (possibly the same value) in the set S: The notation a <CF b means comparefn(a,b) < 0; a =CF b means comparefn(a,b) = 0 (of either sign); and a >CF b means comparefn(a,b) > 0.
NOTE The above conditions are necessary and sufficient to ensure that comparefn divides the set S into equivalence classes and that these equivalence classes are totally ordered.
Runtime Semantics: SortCompare Abstract Operation
When the SortCompare abstract operation is called with two arguments j and k, the following steps are taken:
NOTE 1 Because non-existent property values always compare greater than undefined property values, and undefined always compares greater than any other value, undefined property values always sort to the end of the result, followed by non-existent property values.
NOTE 2 The sort function is intentionally generic; it does not require that its this value be an Array object. Therefore, it can be transferred to other kinds of objects for use as a method. Whether the sort function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
When the splice method is called with two or more arguments start, deleteCount and (optionally) item1, item2, etc., the deleteCount elements of the array starting at array index start are replaced by the arguments item1, item2, etc. An Array object containing the deleted elements (if any) is returned. The following steps are taken:
The length property of the splice method is 2.
NOTE 1 The explicit setting of the length property of the result Array in step 13 is necessary to ensure that its value is correct in situations where its trailing elements are not present.
NOTE 2 The splice function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the splice function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.13 Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] )
The arguments are prepended to the start of the array, such that their order within the array is the same as the order in which they appear in the argument list.
When the unshift method is called with zero or more arguments item1, item2, etc., the following steps are taken:
The length property of the unshift method is 1.
NOTE The unshift function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the unshift function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.14 Array.prototype.indexOf ( searchElement [ , fromIndex ] )
indexOf compares searchElement to the elements of the array, in ascending order, using the internal Strict Equality Comparison Algorithm (11.9.1), and if found at one or more positions, returns the index of the first such position; otherwise, -1 is returned.
The optional second argument fromIndex defaults to 0 (i.e. the whole array is searched). If it is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched. If it is negative, it is used as the offset from the end of the array to compute fromIndex. If the computed index is less than 0, the whole array will be searched.
When the indexOf method is called with one or two arguments, the following steps are taken:
The length property of the indexOf method is 1.
NOTE The indexOf function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the indexOf function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.15 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
lastIndexOf compares searchElement to the elements of the array in descending order using the internal Strict Equality Comparison Algorithm (11.9.1), and if found at one or more positions, returns the index of the last such position; otherwise, -1 is returned.
The optional second argument fromIndex defaults to the array's length minus one (i.e. the whole array is searched). If it is greater than or equal to the length of the array, the whole array will be searched. If it is negative, it is used as the offset from the end of the array to compute fromIndex. If the computed index is less than 0, -1 is returned.
When the lastIndexOf method is called with one or two arguments, the following steps are taken:
The length property of the lastIndexOf method is 1.
NOTE The lastIndexOf function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the lastIndexOf function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.16 Array.prototype.every ( callbackfn [ , thisArg ] )
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value true or false. every calls callbackfn once for each element present in the array, in ascending order, until it finds one where callbackfn returns false. If such an element is found, every immediately returns false. Otherwise, if callbackfn returned true for all elements, every will return true. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
every does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by every is set before the first call to callbackfn. Elements which are appended to the array after the call to every begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time every visits them; elements that are deleted after the call to every begins and before being visited are not visited. every acts like the "for all" quantifier in mathematics. In particular, for an empty array, it returns true.
When the every method is called with one or two arguments, the following steps are taken:
The length property of the every method is 1.
NOTE The every function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the every function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.17 Array.prototype.some ( callbackfn [ , thisArg ] )
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value true or false. some calls callbackfn once for each element present in the array, in ascending order, until it finds one where callbackfn returns true. If such an element is found, some immediately returns true. Otherwise, some returns false. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
some does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by some is set before the first call to callbackfn. Elements that are appended to the array after the call to some begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time that some visits them; elements that are deleted after the call to some begins and before being visited are not visited. some acts like the "exists" quantifier in mathematics. In particular, for an empty array, it returns false.
When the some method is called with one or two arguments, the following steps are taken:
The length property of the some method is 1.
NOTE The some function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the some function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each element present in the array, in ascending order. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by forEach is set before the first call to callbackfn. Elements which are appended to the array after the call to forEach begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callback will be the value at the time forEach visits them; elements that are deleted after the call to forEach begins and before being visited are not visited.
When the forEach method is called with one or two arguments, the following steps are taken:
The length property of the forEach method is 1.
NOTE The forEach function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the forEach function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.19 Array.prototype.map ( callbackfn [ , thisArg ] )
callbackfn should be a function that accepts three arguments. map calls callbackfn once for each element in the array, in ascending order, and constructs a new Array from the results. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
map does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by map is set before the first call to callbackfn. Elements which are appended to the array after the call to map begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time map visits them; elements that are deleted after the call to map begins and before being visited are not visited.
When the map method is called with one or two arguments, the following steps are taken:
The length property of the map method is 1.
NOTE The map function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the map function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.20 Array.prototype.filter ( callbackfn [ , thisArg ] )
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value true or false. filter calls callbackfn once for each element in the array, in ascending order, and constructs a new array of all the values for which callbackfn returns true. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
filter does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by filter is set before the first call to callbackfn. Elements which are appended to the array after the call to filter begins will not be visited by callbackfn. If existing elements of the array are changed their value as passed to callbackfn will be the value at the time filter visits them; elements that are deleted after the call to filter begins and before being visited are not visited.
When the filter method is called with one or two arguments, the following steps are taken:
The length property of the filter method is 1.
NOTE The filter function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the filter function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.21 Array.prototype.reduce ( callbackfn [ , initialValue ] )
callbackfn should be a function that takes four arguments. reduce calls the callback, as a function, once for each element present in the array, in ascending order.
callbackfn is called with four arguments: the previousValue (or value from the previous call to callbackfn), the currentValue (value of the current element), the currentIndex, and the object being traversed. The first time that callback is called, the previousValue and currentValue can be one of two values. If an initialValue was provided in the call to reduce, then previousValue will be equal to initialValue and currentValue will be equal to the first value in the array. If no initialValue was provided, then previousValue will be equal to the first value in the array and currentValue will be equal to the second. It is a TypeError if the array contains no elements and initialValue is not provided.
reduce does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by reduce is set before the first call to callbackfn. Elements that are appended to the array after the call to reduce begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time reduce visits them; elements that are deleted after the call to reduce begins and before being visited are not visited.
When the reduce method is called with one or two arguments, the following steps are taken:
The length property of the reduce method is 1.
NOTE The reduce function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the reduce function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.22 Array.prototype.reduceRight ( callbackfn [ , initialValue ] )
callbackfn should be a function that takes four arguments. reduceRight calls the callback, as a function, once for each element present in the array, in descending order.
callbackfn is called with four arguments: the previousValue (or value from the previous call to callbackfn), the currentValue (value of the current element), the currentIndex, and the object being traversed. The first time the function is called, the previousValue and currentValue can be one of two values. If an initialValue was provided in the call to reduceRight, then previousValue will be equal to initialValue and currentValue will be equal to the last value in the array. If no initialValue was provided, then previousValue will be equal to the last value in the array and currentValue will be equal to the second-to-last value. It is a TypeError if the array contains no elements and initialValue is not provided.
reduceRight does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by reduceRight is set before the first call to callbackfn. Elements that are appended to the array after the call to reduceRight begins will not be visited by callbackfn. If existing elements of the array are changed by callbackfn, their value as passed to callbackfn will be the value at the time reduceRight visits them; elements that are deleted after the call to reduceRight begins and before being visited are not visited.
When the reduceRight method is called with one or two arguments, the following steps are taken:
The length property of the reduceRight method is 1.
NOTE The reduceRight function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the reduceRight function can be applied successfully to an exotic object that is not an Array is implementation-dependent.
15.4.4.23 Array.prototype.items ( )
The following steps are taken:
15.4.4.24 Array.prototype.keys ( )
The following steps are taken:
15.4.4.25 Array.prototype.values ( )
The following steps are taken:
15.4.4.26 Array.prototype.@@iterator ( )
The initial value of the @@iterator property is the same function object as the initial value of the Array.prototype.items property.
15.4.5 Properties of Array Instances
Array instances are exot Array object that inherit properties from the Array prototype object and have the [[BuiltinBrand]] internal data property with value BuiltinArray. Array instances also have the following properties.
15.4.5.1 length
The length property of this Array object is a data property whose value is always numerically greater than the name of every deletable property whose name is an array index.
The length property initially has the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE Attempting to set the length property of an Array object to a value that is numerically less than or equal to the largest numeric property name of an existing array indexed non-deletable property of the array will result in the length being set to a numeric value that is one greater than that largest numeric property name. See 15.4.5.1.
15.4.6 Array Iterator Object Structure
An Array Iterator is an object, with the structure defined below, that represent a specific iteration over some specific Array instance object. There is not a named constructor for Array Iterator objects. Instead, Array iterator objects are created by calling certain methods of Array instance objects.
15.4.6.1 CreateArrayIterator Abstract Operation
Several methods of Array objects return interator objects. The abstract operation CreateArrayIterator with arguments array and kind is used to create and such iterator objects. It performs the following steps:
15.4.6.2 The Array Iterator Prototype
All Array Iterator Objects inherit properties from a common Array Iterator Prototype object. The [[Prototype]] internal data property of the Array Iterator Prototype is the %ObjectPrototype% intrinsic object. In addition, the Array Iterator Prototype as the following properties:
15.4.6.2.1 ArrayIterator.prototype.constructor
15.4.6.2.2 ArrayIterator.prototype.next( )
15.4.6.2.3 ArrayIterator.prototype.@@iterator ( )
The following steps are taken:
15.4.6.2.4 ArrayIterator.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "Array Iterator".
15.4.6.3 Properties of Array Iterator Instances
Array Iterator instances inherit properties from the Array Iterator prototype (the intrinsic, %ArrayIteratorPrototype%.) Array Iterator instances are initially created with the internal properties listed in Table 31.
Table 31 — Internal Data Properties of Array Iterator Instances
|
Internal Data Property Name |
Description |
|
[[IteratedObject]] |
The object whose array elements are being iterated. |
|
[[ArrayIteratorNextIndex]] |
The integer index of the next array index to be examined by this iteration. |
|
[[ArrayIterationKind]] |
A string value that identifies what is to be returned for each element of the iteration. The possible values are: "key", "value", "key+value", "sparse:key", "sparse:value", "sparse:key+value". |
15.5 String Objects
15.5.1 The String Constructor Called as a Function
When String is called as a function rather than as a constructor, it performs a type conversion.
15.5.1.1 String ( [ value ] )
Returns a String value (not a String object) computed by ToString(value). If value is not supplied, the empty String "" is returned.
15.5.2 The String Constructor
When String is called as part of a new expression, it is a constructor: it initialises the newly created exotic String object.
15.5.2.1 new String ( [ value ] )
The [[Prototype]] internal data property of the newly constructed object is set to the standard built-in String prototype object that is the initial value of String.prototype (15.5.3.1).
The [[Extensible]] internal data property of the newly constructed object is set to true.
The [[StringData]] internal data property of the newly constructed object is set to ToString(value), or to the empty String if value is not supplied.
15.5.3 Properties of the String Constructor
The value of the [[Prototype]] internal data property of the String constructor is the standard built-in Function prototype object (15.3.4).
Besides the length property (whose value is 1), the String constructor has the following properties:
15.5.3.1 String.prototype
The initial value of String.prototype is the standard built-in String prototype object (15.5.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.5.3.2 String.fromCharCode ( …codeUnits)
The String.fromCharCode function may be called with a variable number of arguments which form the rest parameter codeUnits. The following steps are taken:
The length property of the fromCharCode function is 1.
15.5.3.3 String.fromCodePoint ( …codePoints)
The String.fromCodePoint function may be called with a variable number of arguments which form the rest parameter codePoints. The following steps are taken:
The length property of the fromCodePoint function is 0.
15.5.3.4 String.raw ( callSite, …substitutions)
The String.raw function may be called with a variable number of arguments. The first argument is callSite and the remainder of the arguments form the rest parameter substitutions. The following steps are taken:
The length property of the raw function is 1.
NOTE String.raw is intended for use as a tag function of a Tagged Template String (11.2.6). When called as such the first argument will be a well formed template call site object and the rest parameter will contain the substitution values.
15.5.4 Properties of the String Prototype Object
The String prototype object is itself a String object whose value is an empty String. The String prototype object has the [[BuiltinBrand]] internal data property with value BuiltinStringWrapper.
The value of the [[Prototype]] internal data property of the String prototype object is the standard built-in Object prototype object (15.2.4).
15.5.4.1 String.prototype.constructor
The initial value of String.prototype.constructor is the built-in String constructor.
15.5.4.2 String.prototype.toString ( )
Returns this String value. (Note that, for a String object, the toString method happens to return the same thing as the valueOf method.)
The toString function is not generic; it throws a TypeError exception if its this value is not a String or a String object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
15.5.4.3 String.prototype.valueOf ( )
Returns this String value.
The valueOf function is not generic; it throws a TypeError exception if its this value is not a String or String object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
15.5.4.4 String.prototype.charAt (pos)
NOTE Returns a single element String containing the code unit at element position pos in the String value resulting from converting this object to a String. If there is no element at that position, the result is the empty String. The result is a String value, not a String object.
If pos is a value of Number type that is an integer, then the result of x.charAt(pos) is equal to the result of x.substring(pos, pos+1).
When the charAt method is called with one argument pos, the following steps are taken:
NOTE The charAt function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.5 String.prototype.charCodeAt (pos)
NOTE Returns a Number (a nonnegative integer less than 216) that is the code unit value of the string element at position pos in the String resulting from converting this object to a String. If there is no element at that position, the result is NaN.
When the charCodeAt method is called with one argument pos, the following steps are taken:
NOTE The charCodeAt function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
15.5.4.6 String.prototype.concat ( …args )
NOTE When the concat method is called with zero or more arguments, it returns a String consisting of the string elements of this object (converted to a String) followed by the string elements of each of the arguments converted to a String. The result is a String value, not a String object.
The following steps are taken:
The length property of the concat method is 1.
NOTE The concat function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
15.5.4.7 String.prototype.indexOf (searchString, position)
If searchString appears as a substring of the result of converting this object to a String, at one or more positions that are greater than or equal to position, then the index of the smallest such position is returned; otherwise, ‑1 is returned. If position is undefined, 0 is assumed, so as to search all of the String.
The indexOf method takes two arguments, searchString and position, and performs the following steps:
The length property of the indexOf method is 1.
NOTE The indexOf function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.8 String.prototype.lastIndexOf (searchString, position)
If searchString appears as a substring of the result of converting this object to a String at one or more positions that are smaller than or equal to position, then the index of the greatest such position is returned; otherwise, ‑1 is returned. If position is undefined, the length of the String value is assumed, so as to search all of the String.
The lastIndexOf method takes two arguments, searchString and position, and performs the following steps:
The length property of the lastIndexOf method is 1.
NOTE The lastIndexOf function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.9 String.prototype.localeCompare (that)
When the localeCompare method is called with one argument that, it returns a Number other than NaN that represents the result of a locale-sensitive String comparison of the this value (converted to a String) with that (converted to a String). The two Strings are S and That. The two Strings are compared in an implementation-defined fashion. The result is intended to order String values in the sort order specified by the system default locale, and will be negative, zero, or positive, depending on whether S comes before That in the sort order, the Strings are equal, or S comes after That in the sort order, respectively.
Before perform the comparisons the following steps are performed to prepare the Strings:
The localeCompare method, if considered as a function of two arguments this and that, is a consistent comparison function (as defined in 15.4.4.11) on the set of all Strings.
The actual return values are implementation-defined to permit implementers to encode additional information in the value, but the function is required to define a total ordering on all Strings and to return 0 when comparing Strings that are considered canonically equivalent by the Unicode standard.
If no language-sensitive comparison at all is available from the host environment, this function may perform a bitwise comparison.
NOTE 1 The localeCompare method itself is not directly suitable as an argument to Array.prototype.sort because the latter requires a function of two arguments.
NOTE 2 This function is intended to rely on whatever language-sensitive comparison functionality is available to the ECMAScript environment from the host environment, and to compare according to the rules of the host environment’s current locale. It is strongly recommended that this function treat Strings that are canonically equivalent according to the Unicode standard as identical (in other words, compare the Strings as if they had both been converted to Normalised Form C or D first). It is also recommended that this function not honour Unicode compatibility equivalences or decompositions.
NOTE 3 The second parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
NOTE 4 The localeCompare function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.10 String.prototype.match (regexp)
When the match method is called with argument regexp, the following steps are taken:
NOTE The match function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.11 String.prototype.replace (searchValue, replaceValue)
First set string according to the following steps:
If searchValue is a regular expression (an object that has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp), do the following: If searchValue.global is false, then search string for the first match of the regular expression searchValue. If searchValue.global is true, then search string for all matches of the regular expression searchValue. Do the search in the same manner as in String.prototype.match, including the update of searchValue.lastIndex. Let m be the number of left capturing parentheses in searchValue (using NcapturingParens as specified in 15.10.2.1).
If searchValue is not a regular expression, let searchString be ToString(searchValue) and search string for the first occurrence of searchString. Let m be 0.
If replaceValue is a function, then for each matched substring, call the function with the following m + 3 arguments. Argument 1 is the substring that matched. If searchValue is a regular expression, the next m arguments are all of the captures in the MatchResult (see 15.10.2.1). Argument m + 2 is the offset within string where the match occurred, and argument m + 3 is string. The result is a String value derived from the original input by replacing each matched substring with the corresponding return value of the function call, converted to a String if need be.
Otherwise, let newstring denote the result of converting replaceValue to a String. The result is a String value derived from the original input String by replacing each matched substring with a String derived from newstring by replacing elements in newstring by replacement text as specified in Table 32. These $ replacements are done left-to-right, and, once such a replacement is performed, the new replacement text is not subject to further replacements. For example, "$1,$2".replace(/(\$(\d))/g, "$$1-$1$2") returns "$1-$11,$1-$22". A $ in newstring that does not match any of the forms below is left as is.
Table 32 — Replacement Text Symbol Substitutions
|
Code unit |
Unicode Characters |
Replacement text |
|
0x0024, 0x0024 |
$$ |
$ |
|
0x0024, 0x0026 |
$& |
The matched substring. |
|
0x0024, 0x0060 |
$` |
The portion of string that precedes the matched substring. |
|
0x0024, 0x0027 |
$' |
The portion of string that follows the matched substring. |
|
0x0024,
N where |
$n where |
The nth capture, where n is a single digit in the range 1 to 9 and $n is not followed by a decimal digit. If n≤m and the nth capture is undefined, use the empty String instead. If n>m, the result is implementation-defined. |
|
0x0024,
N, N where |
$nn where |
The nnth capture, where nn is a two-digit decimal number in the range 01 to 99. If nn≤m and the nnth capture is undefined, use the empty String instead. If nn>m, the result is implementation-defined. |
NOTE The replace function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.12 String.prototype.search (regexp)
When the search method is called with argument regexp, the following steps are taken:
NOTE The search function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.13 String.prototype.slice (start, end)
The slice method takes two arguments, start and end, and returns a substring of the result of converting this object to a String, starting from element position start and running to, but not including, element position end (or through the end of the String if end is undefined). If start is negative, it is treated as sourceLength+start where sourceLength is the length of the String. If end is negative, it is treated as sourceLength+end where sourceLength is the length of the String. The result is a String value, not a String object. The following steps are taken:
The length property of the slice method is 2.
NOTE The slice function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
15.5.4.14 String.prototype.split (separator, limit)
Returns an Array object into which substrings of the result of converting this object to a String have been stored. The substrings are determined by searching from left to right for occurrences of separator; these occurrences are not part of any substring in the returned array, but serve to divide up the String value. The value of separator may be a String of any length or it may be a RegExp object (i.e., an object with a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp ; see 15.10).
The value of separator may be an empty String, an empty regular expression, or a regular expression that can match an empty String. In this case, separator does not match the empty substring at the beginning or end of the input String, nor does it match the empty substring at the end of the previous separator match. (For example, if separator is the empty String, the String is split up into individual code unit elements; the length of the result array equals the length of the String, and each substring contains one code unit.) If separator is a regular expression, only the first match at a given position of the this String is considered, even if backtracking could yield a non-empty-substring match at that position. (For example, "ab".split(/a*?/) evaluates to the array ["a","b"], while "ab".split(/a*/) evaluates to the array["","b"].)
If the this object is (or converts to) the empty String, the result depends on whether separator can match the empty String. If it can, the result array contains no elements. Otherwise, the result array contains one element, which is the empty String.
If separator is a regular expression that contains capturing parentheses, then each time separator is matched the results (including any undefined results) of the capturing parentheses are spliced into the output array. For example,
"A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/)
evaluates to the array
["A",
undefined, "B", "bold", "/", "B", "and", undefined,
"CODE",
"coded", "/", "CODE", ""]
If separator is undefined, then the result array contains just one String, which is the this value (converted to a String). If limit is not undefined, then the output array is truncated so that it contains no more than limit elements.
When the split method is called, the following steps are taken:
Runtime Semantics: SplitMatch Abstract Operation
The abstract operation SplitMatch takes three parameters, a String S, an integer q, and a String or RegExp R, and performs the following in order to return a MatchResult (see 15.10.2.1):
The length property of the split method is 2.
NOTE 1 The split method ignores the value of separator.global for separators that are RegExp objects.
NOTE 2 The split function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.15 String.prototype.substring (start, end)
The substring method takes two arguments, start and end, and returns a substring of the result of converting this object to a String, starting from element position start and running to, but not including, element position end of the String (or through the end of the String is end is undefined). The result is a String value, not a String object.
If either argument is NaN or negative, it is replaced with zero; if either argument is larger than the length of the String, it is replaced with the length of the String.
If start is larger than end, they are swapped.
The following steps are taken:
The length property of the substring method is 2.
NOTE The substring function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.16 String.prototype.toLowerCase ( )
This function interprets a string value as a sequence of code points, as described in 8.4. The following steps are taken:
The result must be derived according to the case mappings in the Unicode character database (this explicitly includes not only the UnicodeData.txt file, but also the SpecialCasings.txt file that accompanies it).
NOTE 1 The case mapping of some code points may produce multiple code points . In this case the result String may not be the same length as the source String. Because both toUpperCase and toLowerCase have context-sensitive behaviour, the functions are not symmetrical. In other words, s.toUpperCase().toLowerCase() is not necessarily equal to s.toLowerCase().
NOTE 2 The toLowerCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.17 String.prototype.toLocaleLowerCase ( )
This function interprets a string value as a sequence of code points, as described in 8.4.
This function works exactly the same as toLowerCase except that its result is intended to yield the correct result for the host environment’s current locale, rather than a locale-independent result. There will only be a difference in the few cases (such as Turkish) where the rules for that language conflict with the regular Unicode case mappings.
NOTE 1 The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
NOTE 2 The toLocaleLowerCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.18 String.prototype.toUpperCase ( )
This function interprets a string value as a sequence of code points, as described in 8.4.
This function behaves in exactly the same way as String.prototype.toLowerCase, except that code points are mapped to their uppercase equivalents as specified in the Unicode Character Database.
NOTE The toUpperCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.19 String.prototype.toLocaleUpperCase ( )
This function interprets a string value as a sequence of code points, as described in 8.4.
This function works exactly the same as toUpperCase except that its result is intended to yield the correct result for the host environment’s current locale, rather than a locale-independent result. There will only be a difference in the few cases (such as Turkish) where the rules for that language conflict with the regular Unicode case mappings.
NOTE 1 The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
NOTE 2 The toLocaleUpperCase function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.20 String.prototype.trim ( )
This function interprets a string value as a sequence of code points, as described in 8.4.
The following steps are taken:
NOTE The trim function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.21 String.prototype.repeat (count)
The following steps are taken:
NOTE 1 This method creates a String consisting of the string elements of this object (converted to String) repeated count time.
NOTE 2 The repeat function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.22 String.prototype.startsWith (searchString [, position ] )
The following steps are taken:
The length property of the startsWith method is 1.
NOTE 1 This method returns true if the sequence of elements of searchString converted to a String is the same as the corresponding elements of this object (converted to a String) starting at position. Otherwise returns false.
NOTE 2 The startsWith function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.23 String.prototype.endsWith (searchString [, endPosition] )
The following steps are taken:
The length property of the endsWith method is 1.
NOTE 1 Returns true if the sequence of elements of searchString converted to a String is the same as the corresponding elements of this object (converted to a String) starting at endPosition – length(this). Otherwise returns false.
NOTE 2 The endsWith function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.24 String.prototype.contains (searchString, position = 0 )
The contains method takes two arguments, searchString and position, and performs the following steps:
The length property of the contains method is 1.
NOTE 1 If searchString appears as a substring of the result of converting this object to a String, at one or more positions that are greater than or equal to position, then return true; otherwise, returns false. If position is undefined, 0 is assumed, so as to search all of the String.
NOTE 2 The contains function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
15.5.4.25 String.prototype.codePointAt (pos)
NOTE Returns a Number (a nonnegative integer less than 1114112) that is the UTF-16 encoded code point value starting at the string element at position pos in the String resulting from converting this object to a String. If there is no element at that position, the result is NaN. If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.
When the codePointAt method is called with one argument pos, the following steps are taken:
NOTE The codePointAt function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
15.5.5 Properties of String Instances
String instances are String exotic objects and have the internal methods and internal data properties specified for such objects. String instance inherit properties from the String prototype object. String instances also have a length property, and a set of enumerable properties with array index names.
15.5.5.1 length
The number of elements in the String value represented by this String object.
Once a String object is created, this property is unchanging. It has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.6 Boolean Objects
15.6.1 The Boolean Constructor Called as a Function
When Boolean is called as a function rather than as a constructor, it performs a type conversion.
15.6.1.1 Boolean (value)
Returns a Boolean value (not a Boolean object) computed by ToBoolean(value).
15.6.2 The Boolean Constructor
When Boolean is called as part of a new expression it is a constructor: it initialises the newly created ordinary object.
15.6.2.1 new Boolean (value)
The [[Prototype]] internal data property of the newly constructed object is set to the original Boolean prototype object, the one that is the initial value of Boolean.prototype (15.6.3.1).
The newly constructed Boolean object has a [[BuiltinBrand]] internal data property with value BuiltinBooleanWrapper.
The [[BooleanValue]] internal data property of the newly constructed Boolean object is set to ToBoolean(value).
The [[Extensible]] internal data property of the newly constructed object is set to true.
15.6.3 Properties of the Boolean Constructor
The value of the [[Prototype]] internal data property of the Boolean constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 1), the Boolean constructor has the following property:
15.6.3.1 Boolean.prototype
The initial value of Boolean.prototype is the Boolean prototype object (15.6.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.6.4 Properties of the Boolean Prototype Object
The Boolean prototype object is itself a Boolean object whose [[BooleanValue]] internal data property has the value false. The Boolean prototype object has a [[BuiltinBrand]] internal data property whose value is BuiltinBooleanWrapper.
The value of the [[Prototype]] internal data property of the Boolean prototype object is the standard built-in Object prototype object (15.2.4).
15.6.4.1 Boolean.prototype.constructor
The initial value of Boolean.prototype.constructor is the built-in Boolean constructor.
15.6.4.2 Boolean.prototype.toString ( )
The following steps are taken:
15.6.4.3 Boolean.prototype.valueOf ( )
The following steps are taken:
15.6.5 Properties of Boolean Instances
Boolean instances are ordinary objects that inherit properties from the Boolean prototype object. Boolean instance objects have a [[BuiltinBrand]] internal data property whose value is BuiltinBooleanWrapper. Boolean instances also have a [[BooleanData]] internal data property.
The [[BooleanData]] internal data property is the Boolean value represented by this Boolean object.
15.7 Number Objects
15.7.1 The Number Constructor Called as a Function
When Number is called as a function rather than as a constructor, it performs a type conversion.
15.7.1.1 Number ( [ value ] )
Returns a Number value (not a Number object) computed by ToNumber(value) if value was supplied, else returns +0.
15.7.2 The Number Constructor
When Number is called as part of a new expression it is a constructor: it initialises the newly created ordinary object.
15.7.2.1 new Number ( [ value ] )
The [[Prototype]] internal data property of the newly constructed object is set to the original Number prototype object, the one that is the initial value of Number.prototype (15.7.3.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinNumberWrapper.
The [[NumberData]] internal data property of the newly constructed object is set to ToNumber(value) if value was supplied, else to +0.
The [[Extensible]] internal data property of the newly constructed object is set to true.
15.7.3 Properties of the Number Constructor
The value of the [[Prototype]] internal data property of the Number constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 1), the Number constructor has the following properties:
15.7.3.1 Number.prototype
The initial value of Number.prototype is the Number prototype object (15.7.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.2 Number.MAX_VALUE
The value of Number.MAX_VALUE is the largest positive finite value of the Number type, which is approximately 1.7976931348623157 × 10308.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.3 Number.MIN_VALUE
The value of Number.MIN_VALUE is the smallest positive value of the Number type, which is approximately 5 × 10‑324.
In the IEEE-764 double precision binary representation, the smallest possible value is a denormalized number. If an implementation does not support denormalized values, the value of Number.MIN_VALUE must be the smallest non-zero positive value that can actually be represented by the implementation.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.4 Number.NaN
The value of Number.NaN is NaN.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.5 Number.NEGATIVE_INFINITY
The value of Number.NEGATIVE_INFINITY is −∞.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.6 Number.POSITIVE_INFINITY
The value of Number.POSITIVE_INFINITY is +∞.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.7 Number.EPSILON
The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 that is representable as a Number value, which is approximately 2.2204460492503130808472633361816 x 10-16.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.8 Number.MAX_INTEGER
The value of Number.MAX_INTEGER is the largest integer value that can be represented as a Number value without losing precision, which is 9007199254740991.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.7.3.9 Number.parseInt (string, radix)
Same as 15.1.2.2.
15.7.3.10 Number.parseFloat (string)
Same as 15.1.2.3.
15.7.3.11 Number.isNaN (number)
When the Number.isNaN is called with one argument number, the following steps are taken:
NOTE This function differs from the global isNaN function (15.1.2.4) is that it does not convert its argument to a Number before determining whether it is NaN.
15.7.3.12 Number.isFinite (number)
When the Number.isFinite is called with one argument number, the following steps are taken:
15.7.3.13 Number.isInteger (number)
When the Number.isInteger is called with one argument number, the following steps are taken:
15.7.3.14 Number.toInt (number)
When the Number.toInt is called with one argument number, the following steps are taken:
15.7.4 Properties of the Number Prototype Object
The Number prototype object is itself a Number object with a [[BuiltinBrand]] internal data property whose value is BuiltinNumberWrapper. Its value is +0.
The value of the [[Prototype]] internal data property of the Number prototype object is the standard built-in Object prototype object (15.2.4).
Unless explicitly stated otherwise, the methods of the Number prototype object defined below are not generic and the this value passed to them must be either a Number value or an object that has a [[NumberData]] internal data property.
In the following descriptions of functions that are properties of the Number prototype object, the phrase “this Number object” refers to either the object that is the this value for the invocation of the function or, if Type(this value) is Number, an object that is created as if by the expression new Number(this value) where Number is the standard built-in constructor with that name. Also, the phrase “this Number value” refers to either the Number value represented by this Number object, that is, the value of the [[NumberData]] internal data property of this Number object or the this value if its type is Number. A TypeError exception is thrown if the this value is neither an object that has a [[NumberData]] internal data property or a value whose type is Number.
15.7.4.1 Number.prototype.constructor
The initial value of Number.prototype.constructor is the built-in Number constructor.
15.7.4.2 Number.prototype.toString ( [ radix ] )
The optional radix should be an integer value in the inclusive range 2 to 36. If radix not present or is undefined the Number 10 is used as the value of radix. If ToInteger(radix) is the Number 10 then this Number value is given as an argument to the ToString abstract operation; the resulting String value is returned.
If ToInteger(radix) is not an integer between 2 and 36 inclusive throw a RangeError exception. If ToInteger(radix) is an integer from 2 to 36, but not 10, the result is a String representation of this Number value using the specified radix. Letters a-z are used for digits with values 10 through 35. The precise algorithm is implementation-dependent if the radix is not 10, however the algorithm should be a generalisation of that specified in 9.8.1.
The toString function is not generic; it throws a TypeError exception if its this value is not a Number or a Number object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
15.7.4.3 Number.prototype.toLocaleString()
Produces a String value that represents this Number value formatted according to the conventions of the host environment’s current locale. This function is implementation-dependent, and it is permissible, but not encouraged, for it to return the same thing as toString.
NOTE The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
15.7.4.4 Number.prototype.valueOf ( )
The valueOf function is not generic; it throws a TypeError exception if its this value is not a Number or a Number object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
15.7.4.5 Number.prototype.toFixed (fractionDigits)
Return a String containing this Number value represented in decimal fixed-point notation with fractionDigits digits after the decimal point. If fractionDigits is undefined, 0 is assumed. Specifically, perform the following steps:
The length property of the toFixed method is 1.
If the toFixed method is called with more than one argument, then the behaviour is undefined (see clause 15).
An implementation is permitted to extend the behaviour of toFixed for values of fractionDigits less than 0 or greater than 20. In this case toFixed would not necessarily throw RangeError for such values.
NOTE The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values. For example,
(1000000000000000128).toString() returns "1000000000000000100",
while (1000000000000000128).toFixed(0) returns "1000000000000000128".
15.7.4.6 Number.prototype.toExponential (fractionDigits)
Return a String containing this Number value represented in decimal exponential notation with one digit before the significand's decimal point and fractionDigits digits after the significand's decimal point. If fractionDigits is undefined, include as many significand digits as necessary to uniquely specify the Number (just like in ToString except that in this case the Number is always output in exponential notation). Specifically, perform the following steps:
The length property of the toExponential method is 1.
If the toExponential method is called with more than one argument, then the behaviour is undefined (see clause 15).
An implementation is permitted to extend the behaviour of toExponential for values of fractionDigits less than 0 or greater than 20. In this case toExponential would not necessarily throw RangeError for such values.
NOTE For implementations that provide more accurate conversions than required by the rules above, it is recommended that the following alternative version of step 9.b.i be used as a guideline:
15.7.4.7 Number.prototype.toPrecision (precision)
Return a String containing this Number value represented either in decimal exponential notation with one digit before the significand's decimal point and precision–1 digits after the significand's decimal point or in decimal fixed notation with precision significant digits. If precision is undefined, call ToString (9.8.1) instead. Specifically, perform the following steps:
The length property of the toPrecision method is 1.
If the toPrecision method is called with more than one argument, then the behaviour is undefined (see clause 15).
An implementation is permitted to extend the behaviour of toPrecision for values of precision less than 1 or greater than 21. In this case toPrecision would not necessarily throw RangeError for such values.
15.7.4.8 Number.prototype.clz ()
When the Number.prototype.clz is called with one argument number, the following steps are taken:
NOTE If n is 0, p will be 32. If the most significant bit of the 32-bit binary encoding of n is 1, p will be 0.
15.7.5 Properties of Number Instances
Number instances are ordinary objects that inherit properties from the Number prototype object and have a [[BuiltinBrand]] internal data property whose value is BuiltinNumberWrapper. Number instances also have a [[NumberValue]] internal data property.
The [[NumberValue]] internal data property is the Number value represented by this Number object.
15.8 The Math Object
The Math object is a single ordinary object that has some named properties, some of which are functions.
The value of the [[Prototype]] internal data property of the Math object is the standard built-in Object prototype object (15.2.4). The Math object has a [[BuiltinBrand]] internal data property whose value is BuiltinMath.
The Math is not a function object. It does not have a [[Construct]] internal method; it is not possible to use the Math object as a constructor with the new operator.
The Math object does not have a [[Call]] internal method; it is not possible to invoke the Math object as a function.
NOTE In this specification, the phrase “the Number value for x” has a technical meaning defined in 8.5.
15.8.1 Value Properties of the Math Object
15.8.1.1 Math.E
The Number value for e, the base of the natural logarithms, which is approximately 2.7182818284590452354.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.8.1.2 Math.LN10
The Number value for the natural logarithm of 10, which is approximately 2.302585092994046.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.8.1.3 Math.LN2
The Number value for the natural logarithm of 2, which is approximately 0.6931471805599453.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.8.1.4 Math.LOG2E
The Number value for the base-2 logarithm of e, the base of the natural logarithms; this value is approximately 1.4426950408889634.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE The value of Math.LOG2E is approximately the reciprocal of the value of Math.LN2.
15.8.1.5 Math.LOG10E
The Number value for the base-10 logarithm of e, the base of the natural logarithms; this value is approximately 0.4342944819032518.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE The value of Math.LOG10E is approximately the reciprocal of the value of Math.LN10.
15.8.1.6 Math.PI
The Number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.8.1.7 Math.SQRT1_2
The Number value for the square root of ½, which is approximately 0.7071067811865476.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE The value of Math.SQRT1_2 is approximately the reciprocal of the value of Math.SQRT2.
15.8.1.8 Math.SQRT2
The Number value for the square root of 2, which is approximately 1.4142135623730951.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.8.2 Function Properties of the Math Object
Each of the following Math object functions applies the ToNumber abstract operation to each of its arguments (in left-to-right order if there is more than one). If ToNumber returns an abrupt completion, that completion record is immediately returned. Otherwise, functction performs a computation on the resulting Number value(s).
In the function descriptions below, the symbols NaN, −0, +0, −∞ and +∞ refer to the Number values described in 8.5.
NOTE The behaviour of the functions acos, asin, atan, atan2, cos, exp, log, pow, sin, sqrt, and tan is not precisely specified here except to require specific results for certain argument values that represent boundary cases of interest. For other argument values, these functions are intended to compute approximations to the results of familiar mathematical functions, but some latitude is allowed in the choice of approximation algorithms. The general intent is that an implementer should be able to use the same mathematical library for ECMAScript on a given hardware platform that is available to C programmers on that platform.
Although the choice of algorithms is left to the implementation, it is recommended (but not specified by this standard) that implementations use the approximation algorithms for IEEE 754 arithmetic contained in fdlibm, the freely distributable mathematical library from Sun Microsystems (http://www.netlib.org/fdlibm).
15.8.2.1 Math.abs (x)
Returns the absolute value of x; the result has the same magnitude as x but has positive sign.
15.8.2.2 Math.acos (x)
Returns an implementation-dependent approximation to the arc cosine of x. The result is expressed in radians and ranges from +0 to +π.
15.8.2.3 Math.asin (x)
Returns an implementation-dependent approximation to the arc sine of x. The result is expressed in radians and ranges from −π/2 to +π/2.
15.8.2.4 Math.atan (x)
Returns an implementation-dependent approximation to the arc tangent of x. The result is expressed in radians and ranges from −π/2 to +π/2.
15.8.2.5 Math.atan2 (y, x)
Returns an implementation-dependent approximation to the arc tangent of the quotient y/x of the arguments y and x, where the signs of y and x are used to determine the quadrant of the result. Note that it is intentional and traditional for the two-argument arc tangent function that the argument named y be first and the argument named x be second. The result is expressed in radians and ranges from −π to +π.
15.8.2.6 Math.ceil (x)
Returns the smallest (closest to −∞) Number value that is not less than x and is equal to a mathematical integer. If x is already an integer, the result is x.
The value of Math.ceil(x) is the same as the value of -Math.floor(-x).
15.8.2.7 Math.cos (x)
Returns an implementation-dependent approximation to the cosine of x. The argument is expressed in radians.
15.8.2.8 Math.exp (x)
Returns an implementation-dependent approximation to the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms).
15.8.2.9 Math.floor (x)
Returns the greatest (closest to +∞) Number value that is not greater than x and is equal to a mathematical integer. If x is already an integer, the result is x.
NOTE The value of Math.floor(x) is the same as the value of -Math.ceil(-x).
15.8.2.10 Math.log (x)
15.8.2.11 Math.max ( [ value1 [ , value2 [ , … ] ] ] )
Given zero or more arguments, calls ToNumber on each of the arguments and returns the largest of the resulting values.
The length property of the max method is 2.
15.8.2.12 Math.min ( [ value1 [ , value2 [ , … ] ] ] )
Given zero or more arguments, calls ToNumber on each of the arguments and returns the smallest of the resulting values.
The length property of the min method is 2.
15.8.2.13 Math.pow (x, y)
Returns an implementation-dependent approximation to the result of raising x to the power y.
15.8.2.14 Math.random ( )
Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.
15.8.2.15 Math.round (x)
Returns the Number value that is closest to x and is equal to a mathematical integer. If two integer Number values are equally close to x, then the result is the Number value that is closer to +∞. If x is already an integer, the result is x.
NOTE 1 Math.round(3.5) returns 4, but Math.round(–3.5) returns –3.
NOTE 2 The value of Math.round(x) is the same as the value of Math.floor(x+0.5), except when x is −0 or is less than 0 but greater than or equal to -0.5; for these cases Math.round(x) returns −0, but Math.floor(x+0.5) returns +0.
15.8.2.16 Math.sin (x)
Returns an implementation-dependent approximation to the sine of x. The argument is expressed in radians.
15.8.2.17 Math.sqrt (x)
Returns an implementation-dependent approximation to the square root of x.
15.8.2.18 Math.tan (x)
Returns an implementation-dependent approximation to the tangent of x. The argument is expressed in radians.
15.8.2.19 Math.log10 (x)
Returns an implementation-dependent approximation to the base 10 logarithm of x.
15.8.2.20 Math.log2 (x)
Returns an implementation-dependent approximation to the base 2 logarithm of x.
15.8.2.21 Math.log1p (x)
Returns an implementation-dependent approximation to the natural logarithm of 1 + x. The result is computed in a way that is accurate even when the value of x is close to zero.
15.8.2.22 Math.expm1 (x)
Returns an implementation-dependent approximation to subtracting 1 from the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms). The result is computed in a way that is accurate even when the value of x is close 0.
15.8.2.23 Math.cosh(x)
Returns an implementation-dependent approximation to the hyperbolic cosine of x.
NOTE The value of cosh(x) is the same as (exp(x) + exp(-x))/2.
15.8.2.24 Math.sinh(x)
Returns an implementation-dependent approximation to the hyperbolic sine of x.
NOTE The value of cosh(x) is the same as (exp(x) - exp(-x))/2.
15.8.2.25 Math.tanh(x)
Returns an implementation-dependent approximation to the hyperbolic tangent of x.
NOTE The value of tanh(x) is the same as (exp(x) - exp(-x))/(exp(x) + exp(-x)).
15.8.2.26 Math.acosh(x)
Returns an implementation-dependent approximation to the inverse hyperbolic cosine of x.
15.8.2.27 Math.asinh(x)
Returns an implementation-dependent approximation to the inverse hyperbolic sine of x.
15.8.2.28 Math.atanh(x)
Returns an implementation-dependent approximation to the inverse hyperbolic tangent of x.
15.8.2.29 Math.hypot( value1 , value2, value3 = 0 )
Given two or three arguments, hypot returns an implementation-dependent approximation of the square root of the sum of squares of up to three arguments.
15.8.2.30 hypot2( value1 , value2 [, value3 ] )
Given two or three arguments, hypot2 returns an implementation-dependent approximation of the sum of squares of its arguments.
15.8.2.30 Math.trunc(x)
Returns the integral part of the number x, removing any fractional digits. If x is already an integer, the result is x.
15.8.2.31 Math.sign(x)
Returns the sign of the x, indicating whether x is positive, negative or zero.
15.8.2.32 Math.cbrt(x)
Returns an implementation-dependent approximation to the cube root of x.
15.9 Date Objects
15.9.1 Overview of Date Objects and Definitions of Abstract Operations
The following functions are abstract operations that operate on time values (defined in 15.9.1.1). Note that, in every case, if any argument to one of these functions is NaN, the result will be NaN.
15.9.1.1 Time Values and Time Range
A Date object contains a Number indicating a particular instant in time to within a millisecond. Such a Number is called a time value. A time value may also be NaN, indicating that the Date object does not represent a specific instant of time.
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day. ECMAScript Number values can represent all integers from –9,007,199,254,740,992 to 9,007,199,254,740,992; this range suffices to measure times to millisecond precision for any instant that is within approximately 285,616 years, either forward or backward, from 01 January, 1970 UTC.
The actual range of times supported by ECMAScript Date objects is slightly smaller: exactly –100,000,000 days to 100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. This gives a range of 8,640,000,000,000,000 milliseconds to either side of 01 January, 1970 UTC.
The exact moment of midnight at the beginning of 01 January, 1970 UTC is represented by the value +0.
15.9.1.2 Day Number and Time within Day
A given time value t belongs to day number
Day(t) = floor(t / msPerDay)
where the number of milliseconds per day is
msPerDay = 86400000
The remainder is called the time within the day:
TimeWithinDay(t) = t modulo msPerDay
15.9.1.3 Year Number
ECMAScript uses an extrapolated Gregorian system to map a day number to a year number and to determine the month and date within that year. In this system, leap years are precisely those which are (divisible by 4) and ((not divisible by 100) or (divisible by 400)). The number of days in year number y is therefore defined by
DaysInYear(y) = 365 if (y modulo
4) ≠ 0
= 366 if (y modulo 4) = 0 and (y
modulo 100) ≠ 0
= 365 if (y modulo 100) = 0 and (y modulo 400) ≠ 0
= 366 if (y modulo 400) = 0
All non-leap years have 365 days with the usual number of days per month and leap years have an extra day in February. The day number of the first day of year y is given by:
DayFromYear(y) = 365 × (y−1970) + floor((y−1969)/4) − floor((y−1901)/100) + floor((y−1601)/400)
The time value of the start of a year is:
TimeFromYear(y) = msPerDay × DayFromYear(y)
A time value determines a year by:
YearFromTime(t) = the largest integer y (closest to positive infinity) such that TimeFromYear(y) ≤ t
The leap-year function is 1 for a time within a leap year and otherwise is zero:
InLeapYear(t) = 0 if DaysInYear(YearFromTime(t)) = 365
= 1 if DaysInYear(YearFromTime(t)) = 366
15.9.1.4 Month Number
Months are identified by an integer in the range 0 to 11, inclusive. The mapping MonthFromTime(t) from a time value t to a month number is defined by:
MonthFromTime(t) = 0 if 0 ≤ DayWithinYear(t) <
31
= 1 if 31 ≤ DayWithinYear (t) < 59+InLeapYear(t)
= 2 if 59+InLeapYear(t)
≤ DayWithinYear (t) < 90+InLeapYear(t)
= 3 if 90+InLeapYear(t) ≤
DayWithinYear (t) < 120+InLeapYear(t)
= 4 if 120+InLeapYear(t) ≤
DayWithinYear (t) < 151+InLeapYear(t)
= 5 if 151+InLeapYear(t) ≤
DayWithinYear (t) < 181+InLeapYear(t)
= 6 if 181+InLeapYear(t) ≤
DayWithinYear (t) < 212+InLeapYear(t)
= 7 if 212+InLeapYear(t) ≤
DayWithinYear (t) < 243+InLeapYear(t)
= 8 if 243+InLeapYear(t) ≤
DayWithinYear (t) < 273+InLeapYear(t)
= 9 if 273+InLeapYear(t) ≤
DayWithinYear (t) < 304+InLeapYear(t)
= 10 if 304+InLeapYear(t) ≤
DayWithinYear (t) < 334+InLeapYear(t)
= 11 if 334+InLeapYear(t) ≤
DayWithinYear (t) < 365+InLeapYear(t)
where
DayWithinYear(t) = Day(t)−DayFromYear(YearFromTime(t))
A month value of 0 specifies January; 1 specifies February; 2 specifies March; 3 specifies April; 4 specifies May; 5 specifies June; 6 specifies July; 7 specifies August; 8 specifies September; 9 specifies October; 10 specifies November; and 11 specifies December. Note that MonthFromTime(0) = 0, corresponding to Thursday, 01 January, 1970.
15.9.1.5 Date Number
A date number is identified by an integer in the range 1 through 31, inclusive. The mapping DateFromTime(t) from a time value t to a month number is defined by:
DateFromTime(t) = DayWithinYear(t)+1 if MonthFromTime(t)=0
= DayWithinYear(t)−30 if
MonthFromTime(t)=1
= DayWithinYear(t)−58−InLeapYear(t) if MonthFromTime(t)=2
= DayWithinYear(t)−89−InLeapYear(t) if MonthFromTime(t)=3
= DayWithinYear(t)−119−InLeapYear(t) if MonthFromTime(t)=4
= DayWithinYear(t)−150−InLeapYear(t) if MonthFromTime(t)=5
= DayWithinYear(t)−180−InLeapYear(t) if MonthFromTime(t)=6
= DayWithinYear(t)−211−InLeapYear(t) if MonthFromTime(t)=7
= DayWithinYear(t)−242−InLeapYear(t) if MonthFromTime(t)=8
= DayWithinYear(t)−272−InLeapYear(t) if MonthFromTime(t)=9
= DayWithinYear(t)−303−InLeapYear(t) if MonthFromTime(t)=10
= DayWithinYear(t)−333−InLeapYear(t) if MonthFromTime(t)=11
15.9.1.6 Week Day
The weekday for a particular time value t is defined as
WeekDay(t) = (Day(t) + 4) modulo 7
A weekday value of 0 specifies Sunday; 1 specifies Monday; 2 specifies Tuesday; 3 specifies Wednesday; 4 specifies Thursday; 5 specifies Friday; and 6 specifies Saturday. Note that WeekDay(0) = 4, corresponding to Thursday, 01 January, 1970.
15.9.1.7 Local Time Zone Adjustment
An implementation of ECMAScript is expected to determine the local time zone adjustment. The local time zone adjustment is a value LocalTZA measured in milliseconds which when added to UTC represents the local standard time. Daylight saving time is not reflected by LocalTZA.
NOTE It is recommended that implementations use the time zone information of the IANA Time Zone Database.
15.9.1.8 Daylight Saving Time Adjustment
An implementation of ECMAScript is expected to make its best effort to determine the local daylight saving time adjustment. An implementation dependent algorithm using best available information on time zones to determine the local daylight saving time adjustment DaylightSavingTA(t), measured in milliseconds.
15.9.1.9 Local Time
Conversion from UTC to local time is defined by
LocalTime(t) = t + LocalTZA + DaylightSavingTA(t)
Conversion from local time to UTC is defined by
UTC(t) = t – LocalTZA – DaylightSavingTA(t – LocalTZA)
Note that UTC(LocalTime(t)) is not necessarily always equal to t.
15.9.1.10 Hours, Minutes, Second, and Milliseconds
The following functions are useful in decomposing time values:
HourFromTime(t) = floor(t / msPerHour) modulo HoursPerDay
MinFromTime(t) = floor(t / msPerMinute) modulo MinutesPerHour
SecFromTime(t) = floor(t / msPerSecond) modulo SecondsPerMinute
msFromTime(t) = t modulo msPerSecond
where
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000
msPerMinute = 60000 = msPerSecond × SecondsPerMinute
msPerHour = 3600000 = msPerMinute × MinutesPerHour
15.9.1.11 MakeTime (hour, min, sec, ms)
The operator MakeTime calculates a number of milliseconds from its four arguments, which must be ECMAScript Number values. This operator functions as follows:
15.9.1.12 MakeDay (year, month, date)
The operator MakeDay calculates a number of days from its three arguments, which must be ECMAScript Number values. This operator functions as follows:
15.9.1.13 MakeDate (day, time)
The operator MakeDate calculates a number of milliseconds from its two arguments, which must be ECMAScript Number values. This operator functions as follows:
15.9.1.14 TimeClip (time)
The operator TimeClip calculates a number of milliseconds from its argument, which must be an ECMAScript Number value. This operator functions as follows:
NOTE The point of step 3 is that an implementation is permitted a choice of internal representations of time values, for example as a 64-bit signed integer or as a 64-bit floating-point value. Depending on the implementation, this internal representation may or may not distinguish −0 and +0.
15.9.1.15 Date Time String Format
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 Extended Format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ
Where the fields are as follows:
YYYY is the decimal digits of the year 0000 to 9999 in the Gregorian calendar.
- “-” (hyphen) appears literally twice in the string.
MM is the month of the year from 01 (January) to 12 (December).
DD is the day of the month from 01 to 31.
T “T” appears literally in the string, to indicate the beginning of the time element.
HH is the number of complete hours that have passed since midnight as two decimal digits from 00 to 24.
: “:” (colon) appears literally twice in the string.
mm is the number of complete minutes since the start of the hour as two decimal digits from 00 to 59.
ss is the number of complete seconds since the start of the minute as two decimal digits from 00 to 59.
. “.” (dot) appears literally in the string.
sss is the number of complete milliseconds since the start of the second as three decimal digits.
Z is the time zone offset specified as “Z” (for UTC) or either “+” or “-” followed by a time expression HH:mm
This format includes date-only forms:
YYYY
YYYY-MM
YYYY-MM-DD
It also includes “date-time” forms that consist of one of the above date-only forms immediately followed by one of the following time forms with an optional time zone offset appended:
THH:mm
THH:mm:ss
THH:mm:ss.sss
All numbers must be base 10. If the MM or DD fields are absent “01” is used as the value. If the HH, mm, or ss fields are absent “00” is used as the value and the value of an absent sss field is “000”. If the time zone offset is absent, the date-time is interpreted as a local time.
Illegal values (out-of-bounds as well as syntax errors) in a format string means that the format string is not a valid instance of this format.
NOTE 1 As every day both starts and ends with midnight, the two notations 00:00 and 24:00 are available to distinguish the two midnights that can be associated with one date. This means that the following two notations refer to exactly the same point in time: 1995-02-04T24:00 and 1995-02-05T00:00
NOTE 2 There exists no international standard that specifies abbreviations for civil time zones like CET, EST, etc. and sometimes the same abbreviation is even used for two very different time zones. For this reason, ISO 8601 and this format specifies numeric representations of date and time.
15.9.1.15.1 Extended years
ECMAScript requires the ability to specify 6 digit years (extended years); approximately 285,426 years, either forward or backward, from 01 January, 1970 UTC. To represent years before 0 or after 9999, ISO 8601 permits the expansion of the year representation, but only by prior agreement between the sender and the receiver. In the simplified ECMAScript format such an expanded year representation shall have 2 extra year digits and is always prefixed with a + or – sign. The year 0 is considered positive and hence prefixed with a + sign.
NOTE Examples of extended years:
-283457-03-21T15:00:59.008Z 283458 B.C.
-000001-01-01T00:00:00Z 2
B.C.
+000000-01-01T00:00:00Z 1 B.C.
+000001-01-01T00:00:00Z
1 A.D.
+001970-01-01T00:00:00Z 1970 A.D.
+002009-12-15T00:00:00Z 2009 A.D.
+287396-10-12T08:59:00.992Z 287396
A.D.
15.9.2 The Date Constructor Called as a Function
When Date is called as a function rather than as a constructor, it returns a String representing the current time (UTC).
NOTE The function call Date(…) is not equivalent to the object creation expression new Date(…) with the same arguments.
15.9.2.1 Date ( [ year [, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] ] ] )
All of the arguments are optional; any arguments supplied are accepted but are completely ignored. A String is created and returned as if by the expression (new Date()).toString() where Date is the standard built-in constructor with that name and toString is the standard built-in method Date.prototype.toString.
15.9.3 The Date Constructor
When Date is called as part of a new expression, it is a constructor: it initialises the newly created ordinary object.
15.9.3.1 new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
When Date is called with two to seven arguments, it computes the date from year, month, and (optionally) date, hours, minutes, seconds and ms.
The [[Prototype]] internal data property of the newly constructed object is set to the original Date prototype object, the one that is the initial value of Date.prototype (15.9.4.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinDate.
The [[Extensible]] internal data property of the newly constructed object is set to true.
The [[DateValue]] internal data property of the newly constructed object is set as follows:
15.9.3.2 new Date (value)
The [[Prototype]] internal data property of the newly constructed object is set to the original Date prototype object, the one that is the initial value of Date.prototype (15.9.4.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinDate.
The [[Extensible]] internal data property of the newly constructed object is set to true.
The [[DateValue]] internal data property of the newly constructed object is set as follows:
15.9.3.3 new Date ( )
The [[Prototype]] internal data property of the newly constructed object is set to the original Date prototype object, the one that is the initial value of Date.prototype (15.9.4.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinDate.
The [[Extensible]] internal data property of the newly constructed object is set to true.
The [[DateValue]] internal data property of the newly constructed object is set to the time value (UTC) identifying the current time.
15.9.4 Properties of the Date Constructor
The value of the [[Prototype]] internal data property of the Date constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 7), the Date constructor has the following properties:
15.9.4.1 Date.prototype
The initial value of Date.prototype is the built-in Date prototype object (15.9.5).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.9.4.2 Date.parse (string)
The parse function applies the ToString operator to its argument. If ToString results in an abrupt completion the Completion Record is immediately returned. Otherwise, parse interprets the resulting String as a date and time; it returns a Number, the UTC time value corresponding to the date and time. The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String. The function first attempts to parse the format of the String according to the rules called out in Date Time String Format (15.9.1.15). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats. Unrecognisable Strings or dates containing illegal element values in the format String shall cause Date.parse to return NaN.
If x is any Date object whose milliseconds amount is zero within a particular implementation of ECMAScript, then all of the following expressions should produce the same numeric value in that implementation, if all the properties referenced have their initial values:
x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())
However, the expression
Date.parse(x.toLocaleString())
is not required to produce the same Number value as the preceding three expressions and, in general, the value produced by Date.parse is implementation-dependent when given any String value that does not conform to the Date Time String Format (15.9.1.15) and that could not be produced in that implementation by the toString or toUTCString method.
15.9.4.3 Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
When the UTC function is called with fewer than two arguments, the behaviour is implementation-dependent. When the UTC function is called with two to seven arguments, it computes the date from year, month and (optionally) date, hours, minutes, seconds and ms. The following steps are taken:
The length property of the UTC function is 7.
NOTE The UTC function differs from the Date constructor in two ways: it returns a time value as a Number, rather than creating a Date object, and it interprets the arguments in UTC rather than as local time.
15.9.4.4 Date.now ( )
The now function return a Number value that is the time value designating the UTC date and time of the occurrence of the call to now.
15.9.5 Properties of the Date Prototype Object
The Date prototype object is itself a Date object and has a [[BuiltinBrand]] internal data property whose value is BuiltinDate. Its [[DateValue]] is NaN.
The value of the [[Prototype]] internal data property of the Date prototype object is the standard built-in Object prototype object (15.2.4).
In following descriptions of functions that are properties of the Date prototype object, the phrase “this Date object” refers to the object that is the this value for the invocation of the function. Unless explicitly noted otherwise, none of these functions are generic; a TypeError exception is thrown if the this value is not an object with a [[DateValue]] internal data property. Also, the phrase “this time value” refers to the Number value for the time represented by this Date object, that is, the value of the [[DateValue]] internal data property of this Date object.
15.9.5.1 Date.prototype.constructor
The initial value of Date.prototype.constructor is the built-in Date constructor.
15.9.5.2 Date.prototype.toString ( )
This function returns a String value. If this time value is NaN, the String value is "Invalid Date", otherwise the contents of the String are implementation-dependent, but are intended to represent the Date in the current time zone in a convenient, human-readable form.
NOTE For any Date value d whose milliseconds amount is zero, the result of Date.parse(d.toString()) is equal to d.valueOf(). See 15.9.4.2.
15.9.5.3 Date.prototype.toDateString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form.
15.9.5.4 Date.prototype.toTimeString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form.
15.9.5.5 Date.prototype.toLocaleString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment’s current locale.
NOTE The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
15.9.5.6 Date.prototype.toLocaleDateString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment’s current locale.
NOTE The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
15.9.5.7 Date.prototype.toLocaleTimeString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment’s current locale.
NOTE The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
15.9.5.8 Date.prototype.valueOf ( )
The valueOf function returns a Number, which is this time value.
15.9.5.9 Date.prototype.getTime ( )
15.9.5.10 Date.prototype.getFullYear ( )
15.9.5.11 Date.prototype.getUTCFullYear ( )
15.9.5.12 Date.prototype.getMonth ( )
15.9.5.13 Date.prototype.getUTCMonth ( )
15.9.5.14 Date.prototype.getDate ( )
15.9.5.15 Date.prototype.getUTCDate ( )
15.9.5.16 Date.prototype.getDay ( )
15.9.5.17 Date.prototype.getUTCDay ( )
15.9.5.18 Date.prototype.getHours ( )
15.9.5.19 Date.prototype.getUTCHours ( )
15.9.5.20 Date.prototype.getMinutes ( )
15.9.5.21 Date.prototype.getUTCMinutes ( )
15.9.5.22 Date.prototype.getSeconds ( )
15.9.5.23 Date.prototype.getUTCSeconds ( )
15.9.5.24 Date.prototype.getMilliseconds ( )
15.9.5.25 Date.prototype.getUTCMilliseconds ( )
15.9.5.26 Date.prototype.getTimezoneOffset ( )
Returns the difference between local time and UTC time in minutes.
15.9.5.27 Date.prototype.setTime (time)
15.9.5.28 Date.prototype.setMilliseconds (ms)
15.9.5.29 Date.prototype.setUTCMilliseconds (ms)
15.9.5.30 Date.prototype.setSeconds (sec [, ms ] )
If ms is not specified, this behaves as if ms were specified with the value getMilliseconds().
The length property of the setSeconds method is 2.
15.9.5.31 Date.prototype.setUTCSeconds (sec [, ms ] )
If ms is not specified, this behaves as if ms were specified with the value getUTCMilliseconds().
The length property of the setUTCSeconds method is 2.
15.9.5.32 Date.prototype.setMinutes (min [, sec [, ms ] ] )
If sec is not specified, this behaves as if sec were specified with the value getSeconds().
If ms is not specified, this behaves as if ms were specified with the value getMilliseconds().
The length property of the setMinutes method is 3.
15.9.5.33 Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )
If sec is not specified, this behaves as if sec were specified with the value getUTCSeconds().
If ms is not specified, this function behaves as if ms were specified with the value return by getUTCMilliseconds().
The length property of the setUTCMinutes method is 3.
15.9.5.34 Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )
If min is not specified, this behaves as if min were specified with the value getMinutes().
If sec is not specified, this behaves as if sec were specified with the value getSeconds().
If ms is not specified, this behaves as if ms were specified with the value getMilliseconds().
The length property of the setHours method is 4.
15.9.5.35 Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )
If min is not specified, this behaves as if min were specified with the value getUTCMinutes().
If sec is not specified, this behaves as if sec were specified with the value getUTCSeconds().
If ms is not specified, this behaves as if ms were specified with the value getUTCMilliseconds().
The length property of the setUTCHours method is 4.
15.9.5.36 Date.prototype.setDate (date)
15.9.5.37 Date.prototype.setUTCDate (date)
15.9.5.38 Date.prototype.setMonth (month [, date ] )
If date is not specified, this behaves as if date were specified with the value getDate().
The length property of the setMonth method is 2.
15.9.5.39 Date.prototype.setUTCMonth (month [, date ] )
If date is not specified, this behaves as if date were specified with the value getUTCDate().
The length property of the setUTCMonth method is 2.
15.9.5.40 Date.prototype.setFullYear (year [, month [, date ] ] )
If month is not specified, this behaves as if month were specified with the value getMonth().
If date is not specified, this behaves as if date were specified with the value getDate().
The length property of the setFullYear method is 3.
15.9.5.41 Date.prototype.setUTCFullYear (year [, month [, date ] ] )
If month is not specified, this behaves as if month were specified with the value getUTCMonth().
If date is not specified, this behaves as if date were specified with the value getUTCDate().
The length property of the setUTCFullYear method is 3.
15.9.5.42 Date.prototype.toUTCString ( )
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the Date in a convenient, human-readable form in UTC.
NOTE The intent is to produce a String representation of a date that is more readable than the format specified in 15.9.1.15. It is not essential that the chosen format be unambiguous or easily machine parsable. If an implementation does not have a preferred human-readable format it is recommended to use the format defined in 15.9.1.15 but with a space rather than a “T” used to separate the date and time elements.
15.9.5.43 Date.prototype.toISOString ( )
This function returns a String value represent the instance in time represented by this Date object. The format of the String is the Date Time string format defined in 15.9.1.15. All fields are present in the String. The time zone is always UTC, denoted by the suffix Z. If the time value of this object is not a finite Number a RangeError exception is thrown.
15.9.5.44 Date.prototype.toJSON ( key )
This function provides a String representation of a Date object for use by JSON.stringify (15.12.3).
When the toJSON method is called with argument key, the following steps are taken:
NOTE 1 The argument is ignored.
NOTE 2 The toJSON function is intentionally generic; it does not require that its this value be a Date object. Therefore, it can be transferred to other kinds of objects for use as a method. However, it does require that any such object have a toISOString method. An object is free to use the argument key to filter its stringification.
15.9.5.4d Date.prototype.@@ToPrimitive ( hint )
This function is called by ECMAScript language operators to convert an object to a primitive value. The allowed values for hint are "default", "number", and "string". Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string", All other built-in ECMAScript objects treat "default" as being equivalent to "number".
When the @@ToPrimitive method is called with argument hint, the following steps are taken:
15.9.6 Properties of Date Instances
Date instances are ordinary objects that inherit properties from the Date prototype object and have a [[BuiltinBrand]] internal whose value is BuiltinDate. Date instances also have a [[DateValue]] internal data property.
The [[DateValue]] internal data property is time value represented by this Date object.
15.10 RegExp (Regular Expression) Objects
A RegExp object contains a regular expression and the associated flags.
NOTE The form and functionality of regular expressions is modelled after the regular expression facility in the Perl 5 programming language.
15.10.1 Patterns
The RegExp constructor applies the following grammar to the input pattern String. An error occurs if the grammar cannot interpret the String as an expansion of Pattern.
Syntax
Pattern ::
Disjunction
Disjunction ::
Alternative
Alternative | Disjunction
Alternative ::
[empty]
Alternative
Term
Term ::
Assertion
Atom
Atom Quantifier
Assertion ::
^
$
\ b
\ B
( ? = Disjunction )
( ? ! Disjunction )
Quantifier ::
QuantifierPrefix
QuantifierPrefix ?
QuantifierPrefix ::
*
+
?
{ DecimalDigits }
{ DecimalDigits , }
{ DecimalDigits , DecimalDigits }
Atom ::
PatternCharacter
.
\ AtomEscape
CharacterClass
( Disjunction )
( ? : Disjunction )
PatternCharacter ::
SourceCharacter but not
one of
^ $ \ . * + ? (
) [ ] { } |
AtomEscape ::
DecimalEscape
CharacterEscape
CharacterClassEscape
CharacterEscape ::
ControlEscape
c
ControlLetter
HexEscapeSequence
UnicodeEscapeSequence
IdentityEscape
ControlEscape :: one of
f n r t v
ControlLetter :: one of
a b c d e f g h
i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
IdentityEscape ::
SourceCharacter but not
IdentifierPart
<ZWJ>
<ZWNJ>
DecimalEscape ::
DecimalIntegerLiteral [lookahead ∉ DecimalDigit]
CharacterClassEscape :: one of
d D s S w W
CharacterClass ::
[ [lookahead ∉ {^}] ClassRanges ]
[ ^ ClassRanges ]
ClassRanges ::
[empty]
NonemptyClassRanges
NonemptyClassRanges ::
ClassAtom
ClassAtom NonemptyClassRangesNoDash
ClassAtom - ClassAtom ClassRanges
NonemptyClassRangesNoDash ::
ClassAtom
ClassAtomNoDash NonemptyClassRangesNoDash
ClassAtomNoDash - ClassAtom ClassRanges
ClassAtom ::
-
ClassAtomNoDash
ClassAtomNoDash ::
SourceCharacter but
not one of \ or ] or -
\ ClassEscape
ClassEscape ::
DecimalEscape
b
CharacterEscape
CharacterClassEscape
15.10.2 Pattern Semantics
A regular expression pattern is converted into an internal procedure using the process described below. An implementation is encouraged to use more efficient algorithms than the ones listed below, as long as the results are the same. The internal procedure is used as the value of a RegExp object’s [[Match]] internal data property.
15.10.2.1 Notation
The descriptions below use the following variables:
Furthermore, the descriptions below use the following internal data structures:
15.10.2.2 Pattern
The production Pattern :: Disjunction evaluates as follows:
NOTE A Pattern evaluates ("compiles") to an internal procedure value. RegExp.prototype.exec can then apply this procedure to a String and an offset within the String to determine whether the pattern would match starting at exactly that offset within the String, and, if it does match, what the values of the capturing parentheses would be. The algorithms in 15.10.2 are designed so that compiling a pattern may throw a SyntaxError exception; on the other hand, once the pattern is successfully compiled, applying its result internal procedure to find a match in a String cannot throw an exception (except for any host-defined exceptions that can occur anywhere such as out-of-memory).
15.10.2.3 Disjunction
The production Disjunction :: Alternative evaluates by evaluating Alternative to obtain a Matcher and returning that Matcher.
The production Disjunction :: Alternative | Disjunction evaluates as follows:
NOTE The | regular expression operator separates two alternatives. The pattern first tries to match the left Alternative (followed by the sequel of the regular expression); if it fails, it tries to match the right Disjunction (followed by the sequel of the regular expression). If the left Alternative, the right Disjunction, and the sequel all have choice points, all choices in the sequel are tried before moving on to the next choice in the left Alternative. If choices in the left Alternative are exhausted, the right Disjunction is tried instead of the left Alternative. Any capturing parentheses inside a portion of the pattern skipped by | produce undefined values instead of Strings. Thus, for example,
/a|ab/.exec("abc")
returns the result "a" and not "ab". Moreover,
/((a)|(ab))((c)|(bc))/.exec("abc")
returns the array
["abc", "a", "a", undefined, "bc", undefined, "bc"]
and not
["abc", "ab", undefined, "ab", "c", "c", undefined]
15.10.2.4 Alternative
The production Alternative :: [empty] evaluates by returning a Matcher that takes two arguments, a State x and a Continuation c, and returns the result of calling c(x).
The production Alternative :: Alternative Term evaluates as follows:
NOTE Consecutive Terms try to simultaneously match consecutive portions of the input String. If the left Alternative, the right Term, and the sequel of the regular expression all have choice points, all choices in the sequel are tried before moving on to the next choice in the right Term, and all choices in the right Term are tried before moving on to the next choice in the left Alternative.
15.10.2.5 Term
The production Term :: Assertion evaluates by returning an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following:
The production Term :: Atom evaluates by evaluating Atom to obtain a Matcher and returning that Matcher.
The production Term :: Atom Quantifier evaluates as follows:
Runtime Semantics: RepeatMatcher Abstract Operation
The abstract operation RepeatMatcher takes eight parameters, a Matcher m, an integer min, an integer (or ∞) max, a Boolean greedy, a State x, a Continuation c, an integer parenIndex, and an integer parenCount, and performs the following:
NOTE 1 An Atom followed by a Quantifier is repeated the number of times specified by the Quantifier. A Quantifier can be non-greedy, in which case the Atom pattern is repeated as few times as possible while still matching the sequel, or it can be greedy, in which case the Atom pattern is repeated as many times as possible while still matching the sequel. The Atom pattern is repeated rather than the input String that it matches, so different repetitions of the Atom can match different input substrings.
NOTE 2 If the Atom and the sequel of the regular expression all have choice points, the Atom is first matched as many (or as few, if non-greedy) times as possible. All choices in the sequel are tried before moving on to the next choice in the last repetition of Atom. All choices in the last (nth) repetition of Atom are tried before moving on to the next choice in the next-to-last (n–1)st repetition of Atom; at which point it may turn out that more or fewer repetitions of Atom are now possible; these are exhausted (again, starting with either as few or as many as possible) before moving on to the next choice in the (n-1)st repetition of Atom and so on.
Compare
/a[a-z]{2,4}/.exec("abcdefghi")
which returns "abcde" with
/a[a-z]{2,4}?/.exec("abcdefghi")
which returns "abc".
Consider also
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
which, by the choice point ordering above, returns the array
["aaba", "ba"]
and not any of:
["aabaac", "aabaac"]
["aabaac", "c"]
The above ordering of choice points can be used to write a regular expression that calculates the greatest common divisor of two numbers (represented in unary notation). The following example calculates the gcd of 10 and 15:
"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/,"$1")
which returns the gcd in unary notation "aaaaa".
NOTE 3 Step 4 of the RepeatMatcher clears Atom's captures each time Atom is repeated. We can see its behaviour in the regular expression
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
which returns the array
["zaacbbbcac", "z", "ac", "a", undefined, "c"]
and not
["zaacbbbcac", "z", "ac", "a", "bbb", "c"]
because each iteration of the outermost * clears all captured Strings contained in the quantified Atom, which in this case includes capture Strings numbered 2, 3, 4, and 5.
NOTE 4 Step 1 of the RepeatMatcher's d closure states that, once the minimum number of repetitions has been satisfied, any more expansions of Atom that match the empty String are not considered for further repetitions. This prevents the regular expression engine from falling into an infinite loop on patterns such as:
/(a*)*/.exec("b")
or the slightly more complicated:
/(a*)b\1+/.exec("baaaac")
which returns the array
["b", ""]
15.10.2.6 Assertion
The production Assertion :: ^ evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following:
The production Assertion :: $ evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following:
The production Assertion :: \ b evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following:
The production Assertion :: \ B evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following:
The production Assertion :: ( ? = Disjunction ) evaluates as follows:
The production Assertion :: ( ? ! Disjunction ) evaluates as follows:
Runtime Semantics: IsWordChar Abstract Operation
The abstract operation IsWordChar takes an integer parameter e and performs the following:
|
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
_ |
15.10.2.7 Quantifier
The production Quantifier :: QuantifierPrefix evaluates as follows:
The production Quantifier :: QuantifierPrefix ? evaluates as follows:
The production QuantifierPrefix :: * evaluates by returning the two results 0 and ∞.
The production QuantifierPrefix :: + evaluates by returning the two results 1 and ∞.
The production QuantifierPrefix :: ? evaluates by returning the two results 0 and 1.
The production QuantifierPrefix :: { DecimalDigits } evaluates as follows:
The production QuantifierPrefix :: { DecimalDigits , } evaluates as follows:
The production QuantifierPrefix :: { DecimalDigits , DecimalDigits } evaluates as follows:
15.10.2.8 Atom
The production Atom :: PatternCharacter evaluates as follows:
The production Atom :: . evaluates as follows:
The production Atom :: \ AtomEscape evaluates by evaluating AtomEscape to obtain a Matcher and returning that Matcher.
The production Atom :: CharacterClass evaluates as follows:
The production Atom :: ( Disjunction ) evaluates as follows:
The production Atom :: ( ? : Disjunction ) evaluates by evaluating Disjunction to obtain a Matcher and returning that Matcher.
Runtime Semantics: CharacterSetMatcher Abstract Operation
The abstract operation CharacterSetMatcher takes two arguments, a CharSet A and a Boolean flag invert, and performs the following:
Runtime Semantics: Canonicalize Abstract Operation
The abstract operation Canonicalize takes a character parameter ch and performs the following steps:
NOTE 1 Parentheses of the form ( Disjunction ) serve both to group the components of the Disjunction pattern together and to save the result of the match. The result can be used either in a backreference (\ followed by a nonzero decimal number), referenced in a replace String, or returned as part of an array from the regular expression matching internal procedure. To inhibit the capturing behaviour of parentheses, use the form (?: Disjunction ) instead.
NOTE 2 The form (?= Disjunction ) specifies a zero-width positive lookahead. In order for it to succeed, the pattern inside Disjunction must match at the current position, but the current position is not advanced before matching the sequel. If Disjunction can match at the current position in several ways, only the first one is tried. Unlike other regular expression operators, there is no backtracking into a (?= form (this unusual behaviour is inherited from Perl). This only matters when the Disjunction contains capturing parentheses and the sequel of the pattern contains backreferences to those captures.
For example,
/(?=(a+))/.exec("baaabac")
matches the empty String immediately after the first b and therefore returns the array:
["", "aaa"]
To illustrate the lack of backtracking into the lookahead, consider:
/(?=(a+))a*b\1/.exec("baaabac")
This expression returns
["aba", "a"]
and not:
["aaaba", "a"]
NOTE 3 The form (?! Disjunction ) specifies a zero-width negative lookahead. In order for it to succeed, the pattern inside Disjunction must fail to match at the current position. The current position is not advanced before matching the sequel. Disjunction can contain capturing parentheses, but backreferences to them only make sense from within Disjunction itself. Backreferences to these capturing parentheses from elsewhere in the pattern always return undefined because the negative lookahead must fail for the pattern to succeed. For example,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
looks for an a not immediately followed by some positive number n of a's, a b, another n a's (specified by the first \2) and a c. The second \2 is outside the negative lookahead, so it matches against undefined and therefore always succeeds. The whole expression returns the array:
["baaabaac", "ba", undefined, "abaac"]
In case-insignificant matches all characters are implicitly converted to upper case immediately before they are compared. However, if converting a character to upper case would expand that character into more than one character (such as converting "ß" (\u00DF) into "SS"), then the character is left as-is instead. The character is also left as-is if it is not an ASCII character but converting it to upper case would make it into an ASCII character. This prevents Unicode characters such as \u0131 and \u017F from matching regular expressions such as /[a‑z]/i, which are only intended to match ASCII letters. Furthermore, if these conversions were allowed, then /[^\W]/i would match each of a, b, …, h, but not i or s.
15.10.2.9 AtomEscape
The production AtomEscape :: DecimalEscape evaluates as follows:
The production AtomEscape :: CharacterEscape evaluates as follows:
The production AtomEscape :: CharacterClassEscape evaluates as follows:
NOTE An escape sequence of the form \ followed by a nonzero decimal number n matches the result of the nth set of capturing parentheses (see 15.10.2.11). It is an error if the regular expression has fewer than n capturing parentheses. If the regular expression has n or more capturing parentheses but the nth one is undefined because it has not captured anything, then the backreference always succeeds.
15.10.2.10 CharacterEscape
The production CharacterEscape :: ControlEscape evaluates by returning the character according to Table 33.
Table 33 — ControlEscape Character Values
|
ControlEscape |
Code Unit |
Name |
Symbol |
|
t |
\u0009 |
horizontal tab |
<HT> |
|
n |
\u000A |
line feed (new line) |
<LF> |
|
v |
\u000B |
vertical tab |
<VT> |
|
f |
\u000C |
form feed |
<FF> |
|
r |
\u000D |
carriage return |
<CR> |
The production CharacterEscape :: c ControlLetter evaluates as follows:
The production CharacterEscape :: HexEscapeSequence evaluates by evaluating the CV of the HexEscapeSequence (see 7.8.4) and returning its character result.
The production CharacterEscape :: UnicodeEscapeSequence evaluates by evaluating the CV of the UnicodeEscapeSequence (see 7.8.4) and returning its character result.
The production CharacterEscape :: IdentityEscape evaluates by returning the character represented by IdentityEscape.
15.10.2.11 DecimalEscape
The production DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] evaluates as follows:
The definition of “the MV of DecimalIntegerLiteral” is in 7.8.3.
NOTE If \ is followed by a decimal number n whose first digit is not 0, then the escape sequence is considered to be a backreference. It is an error if n is greater than the total number of left capturing parentheses in the entire regular expression. \0 represents the <NUL> character and cannot be followed by a decimal digit.
15.10.2.12 CharacterClassEscape
The production CharacterClassEscape :: d evaluates by returning the ten-element set of characters containing the characters 0 through 9 inclusive.
The production CharacterClassEscape :: D evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: d.
The production CharacterClassEscape :: s evaluates by returning the set of characters containing the characters that are on the right-hand side of the WhiteSpace (7.2) or LineTerminator (7.3) productions.
The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.
The production CharacterClassEscape :: w evaluates by returning the set of characters containing the sixty-three characters:
|
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
_ |
The production CharacterClassEscape :: W evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: w.
15.10.2.13 CharacterClass
The production CharacterClass :: [ [lookahead ∉ {^}] ClassRanges ] evaluates by evaluating ClassRanges to obtain a CharSet and returning that CharSet and the Boolean false.
The production CharacterClass :: [ ^ ClassRanges ] evaluates by evaluating ClassRanges to obtain a CharSet and returning that CharSet and the Boolean true.
15.10.2.14 ClassRanges
The production ClassRanges :: [empty] evaluates by returning the empty CharSet.
The production ClassRanges :: NonemptyClassRanges evaluates by evaluating NonemptyClassRanges to obtain a CharSet and returning that CharSet.
15.10.2.15 NonemptyClassRanges
The production NonemptyClassRanges :: ClassAtom evaluates by evaluating ClassAtom to obtain a CharSet and returning that CharSet.
The production NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash evaluates as follows:
The production NonemptyClassRanges :: ClassAtom - ClassAtom ClassRanges evaluates as follows:
Runtime Semantics: CharacterRange Abstract Operation
The abstract operation CharacterRange takes two CharSet parameters A and B and performs the following:
15.10.2.16 NonemptyClassRangesNoDash
The production NonemptyClassRangesNoDash :: ClassAtom evaluates by evaluating ClassAtom to obtain a CharSet and returning that CharSet.
The production NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash evaluates as follows:
The production NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassRanges evaluates as follows:
NOTE 1 ClassRanges can expand into single ClassAtoms and/or ranges of two ClassAtoms separated by dashes. In the latter case the ClassRanges includes all characters between the first ClassAtom and the second ClassAtom, inclusive; an error occurs if either ClassAtom does not represent a single character (for example, if one is \w) or if the first ClassAtom's code unit value is greater than the second ClassAtom's code unit value.
NOTE 2 Even if the pattern ignores case, the case of the two ends of a range is significant in determining which characters belong to the range. Thus, for example, the pattern /[E-F]/i matches only the letters E, F, e, and f, while the pattern /[E-f]/i matches all upper and lower-case ASCII letters as well as the symbols [, \, ], ^, _, and `.
NOTE 3 A - character can be treated literally or it can denote a range. It is treated literally if it is the first or last character of ClassRanges, the beginning or end limit of a range specification, or immediately follows a range specification.
15.10.2.17 ClassAtom
The production ClassAtom :: - evaluates by returning the CharSet containing the one character -.
The production ClassAtom :: ClassAtomNoDash evaluates by evaluating ClassAtomNoDash to obtain a CharSet and returning that CharSet.
15.10.2.18 ClassAtomNoDash
The production ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - evaluates by returning a one-element CharSet containing the character represented by SourceCharacter.
The production ClassAtomNoDash :: \ ClassEscape evaluates by evaluating ClassEscape to obtain a CharSet and returning that CharSet.
15.10.2.19 ClassEscape
The production ClassEscape :: DecimalEscape evaluates as follows:
The production ClassEscape :: b evaluates by returning the CharSet containing the one character <BS> (Unicode value 0008).
The production ClassEscape :: CharacterEscape evaluates by evaluating CharacterEscape to obtain a character and returning a one-element CharSet containing that character.
The production ClassEscape :: CharacterClassEscape evaluates by evaluating CharacterClassEscape to obtain a CharSet and returning that CharSet.
NOTE A ClassAtom can use any of the escape sequences that are allowed in the rest of the regular expression except for \b, \B, and backreferences. Inside a CharacterClass, \b means the backspace character, while \B and backreferences raise errors. Using a backreference inside a ClassAtom causes an error.
15.10.3 The RegExp Constructor Called as a Function
15.10.3.1 RegExp(pattern, flags)
The following steps are taken:
15.10.4 The RegExp Constructor
When RegExp is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.10.4.1 new RegExp(pattern, flags)
The following steps are taken:
Runtime Semantics: RegExpCreate Abstract Operation
The abstract operation RegExpCreate with arguments pattern and flags does the following:
If pattern is an object R that has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp and flags is undefined, then let P be the pattern used to construct R and let F be the flags used to construct R. If pattern is an object R that has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp and flags is not undefined, then throw a TypeError exception. Otherwise, let P be the empty String if pattern is undefined and ToString(pattern) otherwise, and let F be the empty String if flags is undefined and ToString(flags) otherwise.
If the characters of P do not have the syntactic form Pattern, then throw a SyntaxError exception. Otherwise let the newly constructed object have a [[Match]] internal data property obtained by evaluating ("compiling") the characters of P as a Pattern as described in 15.10.2.
If F contains any character other than "g", "i", or "m", or if it contains the same character more than once, then throw a SyntaxError exception.
If a SyntaxError exception is not thrown, then:
Let S be a String in the form of a Pattern equivalent to P, in which certain characters are escaped as described below. S may or may not be identical to P or pattern; however, the internal procedure that would result from evaluating S as a Pattern must behave identically to the internal procedure given by the constructed object's [[Match]] internal data property.
The characters / occurring in the pattern shall be escaped in S as necessary to ensure that the String value formed by concatenating the Strings "/", S, "/", and F can be parsed (in an appropriate lexical context) as a RegularExpressionLiteral that behaves identically to the constructed regular expression. For example, if P is "/", then S could be "\/" or "\u002F", among other possibilities, but not "/", because /// followed by F would be parsed as a SingleLineComment rather than a RegularExpressionLiteral. If P is the empty String, this specification can be met by letting S be "(?:)".
The following properties of the newly constructed object are data properties with the attributes that are specified in 15.10.7. The [[Value]] of each property is set as follows:
The source property of the newly constructed object is set to S.
The global property of the newly constructed object is set to a Boolean value that is true if F contains the character "g" and false otherwise.
The ignoreCase property of the newly constructed object is set to a Boolean value that is true if F contains the character "i" and false otherwise.
The multiline property of the newly constructed object is set to a Boolean value that is true if F contains the character "m" and false otherwise.
The lastIndex property of the newly constructed object is set to 0.
The [[Prototype]] internal data property of the newly constructed object is set to the standard built-in RegExp prototype object as specified in 15.10.6.
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp
NOTE If pattern is a StringLiteral, the usual escape sequence substitutions are performed before the String is processed by RegExp. If pattern must contain an escape sequence to be recognised by RegExp, any backslash \ characters must be escaped within the StringLiteral to prevent them being removed when the contents of the StringLiteral are formed.
15.10.5 Properties of the RegExp Constructor
The value of the [[Prototype]] internal data property of the RegExp constructor is the standard built-in Function prototype object (15.3.4).
Besides the length property (whose value is 2), the RegExp constructor has the following properties:
15.10.5.1 RegExp.prototype
The initial value of RegExp.prototype is the RegExp prototype object (15.10.6).
This property shall have the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.10.6 Properties of the RegExp Prototype Object
The value of the [[Prototype]] internal data property of the RegExp prototype object is the standard built-in Object prototype object (15.2.4). The RegExp prototype object is itself a regular expression object; it has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp . The initial values of the RegExp prototype object’s data properties (15.10.7) are set as if the object was created by the expression new RegExp() where RegExp is that standard built-in constructor with that name.
The RegExp prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype object.
In the following descriptions of functions that are properties of the RegExp prototype object, the phrase “this RegExp object” refers to the object that is the this value for the invocation of the function; a TypeError exception is thrown if the this value is not an object that has a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp.
15.10.6.1 RegExp.prototype.constructor
The initial value of RegExp.prototype.constructor is the standard built-in RegExp constructor.
15.10.6.2 RegExp.prototype.exec(string)
Performs a regular expression match of string against the regular expression and returns an Array object containing the results of the match, or null if string did not match.
The String ToString(string) is searched for an occurrence of the regular expression pattern as follows:
Runtime Semantics: RegExpExec Abstract Operation
The abstract operation RegExpExec with arguments R (an object) and S (a string) performs the following steps:
15.10.6.3 RegExp.prototype.test(string)
The following steps are taken:
15.10.6.4 RegExp.prototype.toString()
Return the String value formed by concatenating the Strings "/", the String value of the source property of this RegExp object, and "/"; plus "g" if the global property is true, "i" if the ignoreCase property is true, and "m" if the multiline property is true.
NOTE The returned String has the form of a RegularExpressionLiteral that evaluates to another RegExp object with the same behaviour as this object.
15.10.7 Properties of RegExp Instances
RegExp instances inherit properties from the RegExp prototype object and have a [[BuiltinBrand]] internal data property whose value is BuiltinRegExp. RegExp instances also have a [[Match]] internal data property and a length property.
The value of the [[Match]] internal data property is an implementation dependent representation of the Pattern of the RegExp object.
RegExp instances also have the following properties.
15.10.7.1 source
The value of the source property is a String in the form of a Pattern representing the current regular expression. This property shall have the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.10.7.2 global
The value of the global property is a Boolean value indicating whether the flags contained the character “g”. This property shall have the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.10.7.3 ignoreCase
The value of the ignoreCase property is a Boolean value indicating whether the flags contained the character “i”. This property shall have the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.10.7.4 multiline
The value of the multiline property is a Boolean value indicating whether the flags contained the character “m”. This property shall have the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.10.7.5 lastIndex
The value of the lastIndex property specifies the String position at which to start the next match. It is coerced to an integer when used (see 15.10.6.2). This property shall have the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE Unlike the other standard built-in properties of RegExp instances, lastIndex is writable.
15.11 Error Objects
Instances of Error objects are thrown as exceptions when runtime errors occur. The Error objects may also serve as base objects for user-defined exception classes.
15.11.1 The Error Constructor Called as a Function
When Error is called as a function rather than as a constructor, it creates and initialises a new Error object. Thus the function call Error(…) is equivalent to the object creation expression new Error(…) with the same arguments.
15.11.1.1 Error (message)
The [[Prototype]] internal data property of the newly constructed object is set to the original Error prototype object, the one that is the initial value of Error.prototype (15.11.3.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinError.
The [[Extensible]] internal data property of the newly constructed object is set to true.
If the argument message is not undefined, the message own property of the newly constructed object is set to ToString(message).
15.11.2 The Error Constructor
When Error is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.11.2.1 new Error (message)
The [[Prototype]] internal data property of the newly constructed object is set to the original Error prototype object, the one that is the initial value of Error.prototype (15.11.3.1).
The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinError .
The [[Extensible]] internal data property of the newly constructed object is set to true.
If the argument message is not undefined, the message own property of the newly constructed object is set to ToString(message).
15.11.3 Properties of the Error Constructor
The value of the [[Prototype]] internal data property of the Error constructor is the Function prototype object (15.3.4).
Besides the internal properties and the length property (whose value is 1), the Error constructor has the following property:
15.11.3.1 Error.prototype
The initial value of Error.prototype is the Error prototype object (15.11.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.11.4 Properties of the Error Prototype Object
The Error prototype object is itself an Error object and has a [[BuiltinBrand]] internal data property whose value is BuiltinError .
The value of the [[Prototype]] internal data property of the Error prototype object is the standard built-in Object prototype object (15.2.4).
15.11.4.1 Error.prototype.constructor
The initial value of Error.prototype.constructor is the built-in Error constructor.
15.11.4.2 Error.prototype.name
The initial value of Error.prototype.name is "Error".
15.11.4.3 Error.prototype.message
The initial value of Error.prototype.message is the empty String.
15.11.4.4 Error.prototype.toString ( )
The following steps are taken:
15.11.5 Properties of Error Instances
Error instances are ordinary objects that inherit properties from the Error prototype object and have a [[BuiltinBrand]] internal data property whose value is BuiltinError
15.11.6 Native Error Types Used in This Standard
One of the BuiltinError objects below is thrown when a runtime error is detected. All of these objects share the same structure, as described in 15.11.7.
15.11.6.1 EvalError
This exception is not currently used within this specification. This object remains for compatibility with previous editions of this specification.
15.11.6.2 RangeError
Indicates a numeric value has exceeded the allowable range. See 15.4.2.2, 15.4.5.1, 15.7.4.2, 15.7.4.5, 15.7.4.6, 15.7.4.7, and 15.9.5.43.
15.11.6.3 ReferenceError
Indicate that an invalid reference value has been detected. See 8.9.1, 8.9.2, 10.2.1, 10.2.1.1.4, 10.2.1.2.4, and 11.13.1.
15.11.6.4 SyntaxError
Indicates that a parsing error has occurred. See 11.1.5, 11.3.1, 11.3.2, 11.4.1, 11.4.4, 11.4.5, 11.13.1, 11.13.2, 12.2.1, 12.10.1, 12.14.1, 13.1, 15.1.2.1, 15.3.2.1, 15.10.2.2, 15.10.2.5, 15.10.2.9, 15.10.2.15, 15.10.2.19, 15.10.4.1, and 15.12.2.
15.11.6.5 TypeError
Indicates the actual type of an operand is different than the expected type. See 8.6.2, 8.9.2, 8.10.5, 8.12.5, 8.12.7, 8.12.8, 8.12.9, 9.9, 9.10, 10.2.1, 10.2.1.1.3, 10.6, 11.2.2, 11.2.3, 11.4.1, 11.8.6, 11.8.7, 11.3.1, 13.2, 13.2.3, 15, 15.2.3.2, 15.2.3.3, 15.2.3.4, 15.2.3.5, 15.2.3.6, 15.2.3.7, 15.2.3.8, 15.2.3.9, 15.2.3.10, 15.2.3.11, 15.2.3.12, 15.2.3.13, 15.2.3.14, 15.2.4.3, 15.3.4.2, 15.3.4.3, 15.3.4.4, 15.3.4.5, 15.3.4.5.2, 15.3.4.5.3, 15.3.5, 15.3.5.3, 15.3.5.4, 15.4.4.3, 15.4.4.11, 15.4.4.16, 15.4.4.17, 15.4.4.18, 15.4.4.19, 15.4.4.20, 15.4.4.21, 15.4.4.22, 15.4.5.1, 15.5.4.2, 15.5.4.3, 15.6.4.2, 15.6.4.3, 15.7.4, 15.7.4.2, 15.7.4.4, 15.9.5, 15.9.5.44, 15.10.4.1, 15.10.6, 15.11.4.4 and 15.12.3.
15.11.6.6 URIError
Indicates that one of the global URI handling functions was used in a way that is incompatible with its definition. See 15.1.3.
15.11.7 NativeError Object Structure
When an ECMAScript implementation detects a runtime error, it throws an instance of one of the NativeError objects defined in 15.11.6. Each of these objects has the structure described below, differing only in the name used as the constructor name instead of NativeError, in the name property of the prototype object, and in the implementation-defined message property of the prototype object.
For each error object, references to NativeError in the definition should be replaced with the appropriate error object name from 15.11.6.
15.11.7.1 NativeError Constructors Called as Functions
When a NativeError constructor is called as a function rather than as a constructor, it creates and initialises a new object. A call of the object as a function is equivalent to calling it as a constructor with the same arguments.
15.11.7.2 NativeError (message)
The [[Prototype]] internal data property of the newly constructed object is set to the prototype object for this error constructor. The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinError . The [[Extensible]] internal data property of the newly constructed object is set to true.
If the argument message is not undefined, the message own property of the newly constructed object is set to ToString(message).
15.11.7.3 The NativeError Constructors
When a NativeError constructor is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.11.7.4 new NativeError (message)
The [[Prototype]] internal data property of the newly constructed object is set to the prototype object for this NativeError constructor. The newly constructed object has a [[BuiltinBrand]] internal data property whose value is BuiltinError . The [[Extensible]] internal data property of the newly constructed object is set to true.
If the argument message is not undefined, the message own property of the newly constructed object is set to ToString(message).
15.11.7.5 Properties of the NativeError Constructors
The value of the [[Prototype]] internal data property of a NativeError constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 1), each NativeError constructor has the following property:
15.11.7.5.1 NativeError.prototype
The initial value of NativeError.prototype is a NativeError prototype object (15.11.7.7). Each NativeError constructor has a separate prototype object.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.11.7.6 Properties of the NativeError Prototype Objects
Each NativeError prototype object is an Error object and has a [[BuiltinBrand]] internal data property whose value is BuiltinError .
The value of the [[Prototype]] internal data property of each NativeError prototype object is the standard built-in Error prototype object (15.11.4).
15.11.7.6.1 NativeError.prototype.constructor
The initial value of the constructor property of the prototype for a given NativeError constructor is the NativeError constructor function itself (15.11.7).
15.11.7.6.2 NativeError.prototype.name
The initial value of the name property of the prototype for a given NativeError constructor is the name of the constructor (the name used instead of NativeError).
15.11.7.6.3 NativeError.prototype.message
The initial value of the message property of the prototype for a given NativeError constructor is the empty String.
NOTE The prototypes for the NativeError constructors do not themselves provide a toString function, but instances of errors will inherit it from the Error prototype object.
15.11.7.8 Properties of NativeError Instances
NativeError instances inherit properties from their NativeError prototype object and have a [[BuiltinBrand]] internal data property whose value is BuiltinError . NativeError instances have no special properties.
15.12 The JSON Object
The JSON object is a single ordinary object that contains two functions, parse and stringify, that are used to parse and construct JSON texts. The JSON Data Interchange Format is described in RFC 4627 <http://www.ietf.org/rfc/rfc4627.txt>. The JSON interchange format used in this specification is exactly that described by RFC 4627 with two exceptions:
The value of the [[Prototype]] internal data property of the JSON object is the standard built-in Object prototype object (15.2.4). The JSON object has a [[BuiltinBrand]] internal data property whose value is BuiltinJSON . The value of the [[Extensible]] internal data property of the JSON object is set to true.
The JSON object does not have a [[Construct]] internal method; it is not possible to use the JSON object as a constructor with the new operator.
The JSON object does not have a [[Call]] internal method; it is not possible to invoke the JSON object as a function.
15.12.1 The JSON Grammar
JSON.stringify produces a String that conforms to the following JSON grammar. JSON.parse accepts a String that conforms to the JSON grammar.
15.12.1.1 The JSON Lexical Grammar
JSON is similar to ECMAScript source text in that it consists of a sequence of Unicode characters conforming to the rules of SourceCharacter. The JSON Lexical Grammar defines the tokens that make up a JSON text similar to the manner that the ECMAScript lexical grammar defines the tokens of an ECMAScript source text. The JSON Lexical grammar only recognises the white space character specified by the production JSONWhiteSpace. The JSON lexical grammar shares some productions with the ECMAScript lexical grammar. All nonterminal symbols of the grammar that do not begin with the characters “JSON” are defined by productions of the ECMAScript lexical grammar.
Syntax
JSONWhiteSpace ::
<TAB>
<CR>
<LF>
<SP>
JSONString ::
" JSONStringCharactersopt "
JSONStringCharacters ::
JSONStringCharacter JSONStringCharactersopt
JSONStringCharacter ::
SourceCharacter but not one of " or \ or U+0000 through U+001F
\ JSONEscapeSequence
JSONEscapeSequence ::
JSONEscapeCharacter
u HexDigit HexDigit HexDigit HexDigit
JSONEscapeCharacter :: one of
" / \ b f n r t
JSONNumber ::
-opt DecimalIntegerLiteral JSONFractionopt ExponentPartopt
JSONFraction ::
. DecimalDigits
JSONNullLiteral ::
NullLiteral
JSONBooleanLiteral ::
BooleanLiteral
15.12.1.2 The JSON Syntactic Grammar
The JSON Syntactic Grammar defines a valid JSON text in terms of tokens defined by the JSON lexical grammar. The goal symbol of the grammar is JSONText.
Syntax
JSONText :
JSONValue
JSONValue :
JSONNullLiteral
JSONBooleanLiteral
JSONObject
JSONArray
JSONString
JSONNumber
JSONObject :
{
}
{ JSONMemberList }
JSONMember :
JSONString : JSONValue
JSONMemberList :
JSONMember
JSONMemberList , JSONMember
JSONArray :
[
]
[ JSONElementList ]
JSONElementList :
JSONValue
JSONElementList
, JSONValue
15.12.2 JSON.parse ( text [ , reviver ] )
The parse function parses a JSON text (a JSON-formatted String) and produces an ECMAScript value. The JSON format is a restricted form of ECMAScript literal. JSON objects are realized as ECMAScript objects. JSON arrays are realized as ECMAScript arrays. JSON strings, numbers, booleans, and null are realized as ECMAScript Strings, Numbers, Booleans, and null. JSON uses a more limited set of white space characters than WhiteSpace and allows Unicode code points U+2028 and U+2029 to directly appear in JSONString literals without using an escape sequence. The process of parsing is similar to 11.1.4 and 11.1.5 as constrained by the JSON grammar.
The optional reviver parameter is a function that takes two parameters, (key and value). It can filter and transform the results. It is called with each of the key/value pairs produced by the parse, and its return value is used instead of the original value. If it returns what it received, the structure is not modified. If it returns undefined then the property is deleted from the result.
Runtime Semantics: Walk Abstract Operation
The abstract operation Walk is a recursive abstract operation that takes two parameters: a holder object and the String name of a property in that object. Walk uses the value of reviver that was originally passed to the above parse function.
It is not permitted for a conforming implementation of JSON.parse to extend the JSON grammars. If an implementation wishes to support a modified or extended JSON interchange format it must do so by defining a different parse function.
NOTE In the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.
15.12.3 JSON.stringify ( value [ , replacer [ , space ] ] )
The stringify function returns a String in UTF-16 encoded JSON format representing an ECMAScript value. It can take three parameters. The value parameter is an ECMAScript value, which is usually an object or array, although it can also be a String, Boolean, Number or null. The optional replacer parameter is either a function that alters the way objects and arrays are stringified, or an array of Strings and Numbers that acts as a white list for selecting the object properties that will be stringified. The optional space parameter is a String or Number that allows the result to have white space injected into it to improve human readability.
These are the steps in stringifying an object:
Runtime Semantics: Str Abstract Operation
The abstract operation Str(key, holder) has access to ReplacerFunction from the invocation of the stringify method. Its algorithm is as follows:
Runtime Semantics: Quote Abstract Operation
The abstract operation Quote(value) wraps a String value in double quotes and escapes characters within it.
backspace "b"
formfeed "f"
newline "n"
carriage return "r"
tab "t"
Runtime Semantics: JO Abstract Operation
The abstract operation JO(value) serializes an object. It has access to the stack, indent, gap, and PropertyList of the invocation of the stringify method.
Runtime Semantics: JA Abstract Operation
The abstract operation JA(value) serializes an array. It has access to the stack, indent, and gap of the invocation of the stringify method. The representation of arrays includes only the elements between zero and array.length – 1 inclusive. Named properties are excluded from the stringification. An array is stringified as an open left bracket, elements separated by comma, and a closing right bracket.
NOTE 1 JSON structures are allowed to be nested to any depth, but they must be acyclic. If value is or contains a cyclic structure, then the stringify function must throw a TypeError exception. This is an example of a value that cannot be stringified:
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw an TypeError.
NOTE 2 Symbolic primitive values are rendered as follows:
NOTE 3 String values are wrapped in double quotes. The characters " and \ are escaped with \ prefixes. Control characters are replaced with escape sequences \uHHHH, or with the shorter forms, \b (backspace), \f (formfeed), \n (newline), \r (carriage return), \t (tab).
NOTE 4 Finite numbers are stringified as if by calling ToString(number). NaN and Infinity regardless of sign are represented as the String null.
NOTE 5 Values that do not have a JSON representation (such as undefined and functions) do not produce a String. Instead they produce the undefined value. In arrays these values are represented as the String null. In objects an unrepresentable value causes the property to be excluded from stringification.
NOTE 6 An object is rendered as an opening left brace followed by zero or more properties, separated with commas, closed with a right brace. A property is a quoted String representing the key or property name, a colon, and then the stringified property value. An array is rendered as an opening left bracket followed by zero or more values, separated with commas, closed with a right bracket.
15.13 Binary Data Objects
15.13.1 The BinaryData Module
15.13.2 The BinaryData.Type Object
15,13.2.5 BinaryData.ScalarType Type Instance Objects
15.13.3 The BinaryData.ArrayType Object
15.13.4 The BinaryData.StructType Object
The following sections defined “typed arrays” derived from the Kronos specification. This material is a very early draft based upon the strawman at http://wiki.ecmascript.org/doku.php?id=strawman:typed_arrays . This material still needs significant work to fully integrate it into the ES6 spec. and also to integrate typed arrays with ES6 binary data.
Don’t waste a lot of time reviewing this material until it is closer to a finished state.
15.13.5 ArrayBufferObjects
15.13.5.1 The ArrayBuffer Object Called as a Function
When ArrayBuffer is called as a function rather than as a constructor, it creates and initialises a new ArrayBuffer object. Thus the function call ArrayBuffer(…) is equivalent to the object creation expression new ArrayBuffer (…) with the same arguments.
15.13.5.2 The ArrayBuffer Constructor
When ArrayBuffer is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.13.5.2.1 new ArrayBuffer(len)
The [[Prototype]] internal data property of the newly constructed object is set to the original ArrayBuffer prototype object, the one that is the initial value of ArrayBuffer.prototype (16.1.3.1). The [[Class]] internal data property of the newly constructed object is set to “ArrayBuffer”. The [[Extensible]] internal data property of the newly constructed object is set to true.
The length property of the newly constructed object is set to ToUInt32(len).
A fresh native buffer nativeBuffer of length bytes is allocated. The contents of this native buffer are zero initialized. If the requested number of bytes could not be allocated, a RangeError is raised. The [[NativeBuffer]] internal data property of the newly constructed object is set to nativeBuffer.
15.13.5.3 Properties of the ArrayBuffer Constructor
The value of the [[Prototype]] internal data property of the ArrayBuffer constructor is the Function prototype object (15.3.4).
Besides the internal properties and the length property (whose value is 1), the ArrayBuffer constructor has the following properties:
15.13.5.3.1 ArrayBuffer.prototype
The initial value of ArrayBuffer.prototype is the ArrayBuffer prototype object (16.1.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.13.5.4 Properties of the ArrayBuffer Prototype Object
The value of the [[Prototype]] internal data property of the ArrayBuffer prototype object is the standard built-in Object prototype object (15.2.4). The [[Class]] internal data property of the newly constructed object is set to “Object”. The [[Extensible]] internal data property of the newly constructed object is set to true.
15.13.5.4.1 ArrayBuffer.prototype.constructor
The initial value of ArrayBuffer.prototype.constructor is the standard built-in ArrayBuffer constructor.
15.13.5.5 Properties of the ArrayBuffer Instances
ArrayBuffer instances inherit properties from the ArrayBuffer prototype object and their [[Class]] internal data property value is “ArrayBuffer”. ArrayBuffer instances also have the following properties.
15.13.5.5.1 byteLength
The byteLength property of this ArrayBuffer object is a data property whose value is the length of the ArrayBuffer in bytes, as fixed at construction time.
The length property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.13.6 TypeArray Object Structures
For each constructor in the following table is a separate TypeArray constructor object, with corresponding prototype and instances. Each of these TypeArray constructor objects has the structure described below, differing only in the name used as the constructor name instead of TypeArray, in XXXXXXX.
|
Constructor Name |
Element Type |
Size Element |
Description |
Equivalent C Type |
|
Int8Array |
Int8 |
1 |
8-bit 2’s complement signed integer |
signed char |
|
Uint8Array |
Uint8 |
1 |
8-bit unsigned integer |
unsigned char |
|
Int16Array |
Int16 |
2 |
16-bit 2’s complement signed integer |
Short |
|
Uint16Array |
Uint16 |
2 |
16-bit unsigned integer |
unsigned short |
|
Int32Array |
Int32 |
4 |
32-bit 2’s complement signed integer |
Int |
|
Uint32Array |
Uint32 |
4 |
32-bit unsigned integer |
unsigned int |
|
Float32Array |
Float32 |
4 |
32-bit IEEE floating point |
Float |
|
Float64Array |
Float64 |
8 |
64-bit IEEE floating point |
Double |
In the definitions below, references to TypeArray should be replaced with the appropriate constructor name from the above table. The phrase “the element size in bytes” refers to the value in the Element Size column of the table in the row corresponding to the constructor. The phrase “element Type” refers to the value in the Element Type column for that row.
15.13.6.1 TypeArray Constructors Called as a Function
When a TypeArray constructor is called as a function rather than as a constructor, it creates and initialises a new object. A call of the constructor as a function is equivalent to calling it as a constructor with the same arguments.
15.13.6.2 The TypeArray Constructors
When a TypeArray constructor is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.13.6.2.1 new TypeArray(arg0 [, arg1, [, arg2 ] )
The [[Prototype]] internal data property of the newly constructed object is set to the original TypeArray prototype object, the one that is the initial value of TypeArray.prototype (16.2.3.1). The [[Class]] internal data property of the newly constructed object is set to “TypeArray”. The [[Extensible]] internal data property of the newly constructed object is set to true.
The remaining properties of the newly constructed object are set as follows:
15.13.6.3 Properties of the TypeArray Constructors
The value of the [[Prototype]] internal data property of each TypeArray constructor is the Function prototype object (15.3.4).
Besides the internal properties and the length property (whose value is 3), each TypeArray constructor has the following properties:
15.13.6.3.1 TypeArray.prototype
The initial value of TypeArray.prototype is the TypeArray prototype object (15.13.2.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.13.6.3.2 TypeArray.BYTES_PER_ELEMENT
The initial value of TypeArray.BYTES_PER_ELEMENT is the element size in bytes.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.13.6.4 Properties of the TypeArray Prototype Object
The value of the [[Prototype]] internal data property of each TypeArray prototype object is the standard built-in Object prototype object (15.2.4). It’s [[Class]] is “TypeArray”.
15.13.6.4.1 TypeArray.prototype.constructor
The initial value of TypeArray.prototype.constructor is the standard built-in TypeArray constructor.
15.13.6.4.2 TypeArray.prototype.set(array [, offset] )
Set multiple values in the TypedArray, reading from the array input., reading input values from the array. The optional offset value indicates the index in the current array where values are written. If omitted, it is assumed to be 0.
15.13.6.4.3 TypeArray.prototype.subarray(begin [, end] )
Returns a new TypedArray view of the ArrayBuffer store for this TypedArray, referencing the elements at begin, inclusive, up to end, exclusive. If either begin or end is negative, it refers to an index from the end of the array, as opposed to from the beginning.
15.13.6.5 Properties of TypeArray instances
TypeArray instances inherit properties from the TypeArray prototype object and their [[Class]] internal data property value is “TypeArray”. TypeArray instances also have the following properties.
15.13.6.5.1 [[DefineOwnProperty]] ( p, desc, throw )
TypeArray objects use a variation of the [[DefineOwnProperty]] internal method used for other native ECMAScript objects (8.12.9).
When the [[DefineOwnProperty]] internal method of A is called with property P, Property Descriptor Desc and Boolean flag Throw, the following steps are taken:
The internal operation SetValueInBuffer takes five parameters, a native buffer nativeBuffer, an integer byteOffset, an integer index, a value of type Type newValue, and a Type valueType. It operates as follows:
15.13.6.5.2 [[GetOwnProperty]] ( P)
TypeArray objects use a variation of the [[GetOwnProperty]] internal method used for other native ECMAScript objects (8.12.1). This special internal method provides access to named properties corresponding to the individual index values of the TypeArray objects.
When the [[GetOwnProperty]] internal method of A is called with property name P, the following steps are taken:
The internal operation GetValueFromBuffer takes three parameters, a native buffer nativeBuffer, an integer byteOffset, an integer index, a Type valueType, and a boolean isLittleEndian. It operates as follows:
15.13.6.5.3 length
The value of the length property is the length of the TypeArray object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.6.5.4 byteLength
The value of the byteLength property is the length of the TypeArray object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.6.5.5 buffer
The value of the buffer property is the length of the TypeArray object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.6.5.6 byteOffset
The value of the byteOffset property is the length of the TypeArray object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.7 DataView Objects
15.13.7.1 The DataView Constructor Called as a Function
When DataView is called as a function rather than as a constructor, it creates and initialises a new DataView object. Thus the function call DataView(…) is equivalent to the object creation expression new DataView(…) with the same arguments.
15.13.7.2 The DataView Constructor
When DataView is called as part of a new expression, it is a constructor: it initialises the newly created object.
15.13.7.2.1 new DataView(buffer [, byteOffset [, byteLength]])
The [[Prototype]] internal data property of the newly constructed object is set to the original DataView prototype object, the one that is the initial value of DataView.prototype (15.13.3.3.1). The [[Class]] internal data property of the newly constructed object is set to “DataView”. The [[Extensible]] internal data property of the newly constructed object is set to true.
The remaining properties are set as follows:
15.13.7.3 Properties of the DataView Constructor
The value of the [[Prototype]] internal data property of the DataView constructor is the Function prototype object (15.3.4).
Besides the internal properties and the length property (whose value is 3), the DataView constructor has the following properties:
15.13.7.3.1 DataView.prototype
The initial value of DataView.prototype is the DataView prototype object (15.13.3.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.13.7.4 Properties of the DataView Prototype Object
The value of the [[Prototype]] internal data property of the DataView prototype object is the standard built-in Object prototype object (15.2.4). The [[Class]] internal data property of the newly constructed object is set to “Object”. The [[Extensible]] internal data property of the newly constructed object is set to true.
The abstract operation GetValue(byteOffset, isLittleEndian, type) used by functions on DataView instances is defined as follows:
The internal operation SetValue(byteOffset, isLittleEndian, type, value) used by functions on DataView instances is defined as follows:
15.13.7.4.1 DataView.prototype.constructor
The initial value of DataView.prototype.constructor is the standard built-in DataView constructor.
15.13.7.4.2 DataView.prototype.getInt8(byteOffset)
Gets the Int8 value at offset byteOffset in the DataView.
15.13.7.4.3 DataView.prototype.getUint8(byteOffset)
Gets the UInt8 value at offset byteOffset in the DataView.
15.13.7.4.4 DataView.prototype.getInt16(byteOffset, littleEndian)
Gets the Int16 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.5 DataView.prototype.getUint16(byteOffset, littleEndian)
Gets the Uint16 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.6 DataView.prototype.getInt32(byteOffset, littleEndian)
Gets the Int32 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.7 DataView.prototype.getUint32(byteOffset, littleEndian)
Gets the Uint32 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.8 DataView.prototype.getFloat32(byteOffset, littleEndian)
Gets the Float32 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.9 DataView.prototype.getFloat64(byteOffset, littleEndian)
Gets the Float64 value at offset byteOffset in the DataView, using the provided endianness.
15.13.7.4.10 DataView.prototype.setInt8(byteOffset, value)
Sets the Int8 value at offset byteOffset in the DataView.
15.13.7.4.11 DataView.prototype.setUint8(byteOffset, value)
Sets the Uint8 value at offset byteOffset in the DataView.
15.13.7.4.12 DataView.prototype.setInt16(byteOffset, value, littleEndian)
Sets the Int16 value at offset byteOffset in the DataView.
15.13.7.4.13 DataView.prototype.setUint16(byteOffset, value, littleEndian)
Sets the Uint16 value at offset byteOffset in the DataView.
15.13.7.4.14 DataView.prototype.setInt32(byteOffset, value, littleEndian)
Sets the Int32 value at offset byteOffset in the DataView.
15.13.7.4.15 DataView.prototype.setUint32(byteOffset, value, littleEndian)
Sets the Uint32 value at offset byteOffset in the DataView.
15.13.7.4.16 DataView.prototype.setFloat32(byteOffset, value, littleEndian)
Sets the Float32 value at offset byteOffset in the DataView.
15.13.7.4.17 DataView.prototype.setUint16(byteOffset, value, littleEndian)
Sets the Float64 value at offset byteOffset in the DataView.
15.13.7.5 Propeties of DataView Instances
DataView instances inherit properties from the DataView prototype object and their [[Class]] internal data property value is “DataView”. DataView instances also have the following properties.
15.13.7.5.1 byteLength
The value of the byteLength property is the length of the DataView object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.7.5.2 buffer
The value of the buffer property is the length of the DataView object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.13.7.5.3 byteOffset
The value of the byteOffset property is the length of the DataView object, which was fixed at creation. This property has attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]:false }.
15.14 Map Objects
Map objects are collections of key/value pairs where both the keys and values may be arbitrary ECMAScript language values. A Map object can also iterate its elements in insertion order. Map object must be implemented using hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structures used in this Map objects specification is only intended to describe the required observable semantics of Map objects. It is not intended to be a viable implementation model.
15.14.1 Abstract Operations For Map Objects
15.14.1.1 MapInitialisation
The abstract operation MapInitialisation with arguments obj and iterable is used to initialize an object as a map. It performs the following steps:
15.14.2 The Map Constructor Called as a Function
When Map is called as a function rather than as a constructor, it initializes its this value with the internal state necessary to support the Map.prototype internal methods. This permits super invocation of the Map constructor by Map subclasses.
15.14.2.1 Map (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces two element array-like objects whose first element is a value that will be used as an Map key and whose second element is the value to associate with that key.
15.14.3 The Map Constructor
When Map is called as part of a new expression it is a constructor: it initialises the newly created object.
15.14.3.1 new Map (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces two element array-like objects whose first element is a value that will be used as an Map key and whose second element is the value to associate with that key.
15.14.4 Properties of the Map Constructor
The value of the [[Prototype]] internal data property of the Map constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 0), the Map constructor has the following property:
15.14.4.1 Map.prototype
The initial value of Map.prototype is the Map prototype object (15.14.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.14.5 Properties of the Map Prototype Object
The value of the [[Prototype]] internal data property of the Map prototype object is the standard built-in Object prototype object (15.2.4).
15.14.5.1 Map.prototype.constructor
The initial value of Map.prototype.constructor is the built-in Map constructor.
15.14.5.2 Map.prototype.clear ()
The following steps are taken:
15.14.5.3 Map.prototype.delete ( key )
The following steps are taken:
15.14.5.4 Map.prototype.forEach ( callbackfn , thisArg = undefined )
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each key/value pair present in the map object, in key insertion order. callbackfn is called only for keys of the map which actually exist; it is not called for keys that have been deleted from the map.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
NOTE If callbackfn is an Arrow Function, this was lexically bound when the function was created so thisArg will have no effect.
callbackfn is called with three arguments: the value of the item, the key of the item, and the Map object being traversed.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
NOTE Each key is visited only once with the value that is current at the time of the visit. If the value associated with a key is modified after it has been visited, it is not re-visited. Keys that are deleted after the call to forEach begins and before being visited are not visited. New keys added, after the call to forEach begins are visited.
When the forEach method is called with one or two arguments, the following steps are taken:
The length property of the forEach method is 1.
15.14.5.5 Map.prototype.get ( key )
The following steps are taken:
15.14.5.6 Map.prototype.has ( key )
The following steps are taken:
15.14.5.7 Map.prototype.items ( )
The following steps are taken:
15.14.5.8 Map.prototype.keys ( )
The following steps are taken:
15.14.5.9 Map.prototype.set ( key , value )
The following steps are taken:
15.14.5.10 get Map.prototype.size
Map.prototype.size is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps:
15.14.5.11 Map.prototype.values ( )
The following steps are taken:
15.14.5.12 Map.prototype.@@iterator ( )
The initial value of the @@iterator property is the same function object as the initial value of the items property.
15.14.5.13 Map.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "Map".
15.14.6 Properties of Map Instances
Map instances inherit properties from the Map prototype. After initialisation by the Map constructor, Map instances also have a [[MapData]] internal data property.
15.14.7 Map Iterator Object Structure
A Map Iterator is an object, with the structure defined below, that represent a specific iteration over some specific Map instance object. There is not a named constructor for Map Iterator objects. Instead, map iterator objects are created by calling certain methods of Map instance objects.
15.14.7.1 CreateMapIterator Abstract Operation
Several methods of Map objects return interator objects. The abstract operation CreateMapIterator with arguments map and kind is used to create and such iterator objects. It performs the following steps:
15.14.7.2 The Map Iterator Prototype
All Map Iterator Objects inherit properties from a common Map Iterator Prototype object. The [[Prototype]] internal data property of the Map Iterator Prototype is the %ObjectPrototype% intrinsic object. In addition, the Map Iterator Prototype as the following properties:
15.14.7.2.1 MapIterator.prototype.constructor
15.14.7.2.2 MapIterator.prototype.next( )
15.14.7.2.3 MapIterator.prototype.@@iterator ( )
The following steps are taken:
15.14.7.2.4 MapIterator.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "Map Iterator".
15.14.7.3 Properties of Map Iterator Instances
Map Iterator instances inherit properties from the Map Iterator prototype (the intrinsic, %MapIteratorPrototype%.) Map Iterator instances are initially created with the internal properties described in Table 34.
Table 34 — Internal Data Properties of Map Iterator Instances
|
Internal Data Property Name |
Description |
|
[[Map]] |
The Map object that is being iterated. |
|
[[MapNextIndex]] |
The integer index of the next Map data element to be examined by this iteration. |
|
[[MapIterationKind]] |
A string value that identifies what is to be returned for each element of the iteration. The possible values are: "key", "value", "key+value". |
15.15 WeakMap Objects
WeakMap objects are collections of key/value pairs where the keys are ECMAScript objects and values may be arbitrary ECMAScript language values. A WeakMap may be queried to see if it contains an key/value pair with a specific key, but no mechanisms is provided for enumerating the objects it holds as keys. If an object that is being used as the key of a WeakMap key/value pair is only reachable by following a chain of references that start within that WeakMap, then that key/value pair is inaccessible and is automatically removed from the WeakMap. WeakMap implementations must detect and remove such key/value pairs and any associated resources.
An implementation may impose an arbitrarily determined latency between the time a key/value pair of a Weakmap becomes inaccessible and the time when the key/value pair is removed from the Weakmap. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to directly test for the presense of any specific key value.
WeakMap objects must be implemented using hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of key/value pairs in the collection. The data structures used in this WeakMap objects specification are only intended to describe the required observable semantics of WeakMap objects. It is not intended to be a viable implementation model.
NOTE WeakMap are intended to provide a mechanism for dynamically associating state with an object in a manner that does not “leak” memory resources if, in the absence of the WeakMap, otherwise became inaccessible and subject to resource reclamation by the implementation’s garbage collection. Achieving this characteristic requires coordination between the WeakMap implementation and the garbage collections. The following references describe mechanism that may be useful to implementations of WeakMap:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183. http://doi.acm.org/10.1145/263698.263733
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS , vol. 14, no. 21, pp. 3481-3497, 2008. http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
15.15.1 Abstract Operations For WeakMap Objects
15.15.1.1 WeakMapInitialisation
The abstract operation WeakMapInitialisation with arguments obj and iterable is used to initialize an object as a map. It performs the following steps:
15.15.2 The WeakMap Constructor Called as a Function
When WeakMap is called as a function rather than as a constructor, it initializes its this value with the internal state necessary to support the WeakMap.prototype internal methods. This permits super invocation of the WeakMap constructor by WeakKap subclasses.
15.15.2.1 WeakMap (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces two element array-like objects whose first element is a value that will be used as a WeakMap key and whose second element is the value to associate with that key.
15.15.3 The WeakMap Constructor
When WeakMap is called as part of a new expression it is a constructor: it initialises the newly created object.
15.15.3.1 new WeakMap (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces two element array-like objects whose first element is a value that will be used as a WeakMap key and whose second element is the value to associate with that key.
15.15.4 Properties of the WeakMap Constructor
The value of the [[Prototype]] internal data property of the WeakMap constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 0), the WeakMap constructor has the following property:
15.15.4.1 WeakMap.prototype
The initial value of WeakMap.prototype is the WeakMap prototype object (15.15.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.15.5 Properties of the WeakMap Prototype Object
The value of the [[Prototype]] internal data property of the WeakMap prototype object is the standard built-in Object prototype object (15.2.4).
15.15.5.1 WeakMap.prototype.constructor
The initial value of WeakMap.prototype.constructor is the built-in WeakMap constructor.
15.15.5.2 WeakMap.prototype.clear ()
The following steps are taken:
15.15.5.3 WeakMap.prototype.delete ( key )
The following steps are taken:
15.15.5.4 WeakMap.prototype.get ( key )
The following steps are taken:
15.15.5.5 WeakMap.prototype.has ( key )
The following steps are taken:
15.15.5.6 WeakMap.prototype.set ( key , value )
The following steps are taken:
15.15.5.7 WeakMap.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "WeakMap".
15.15.6 Properties of WeakMap Instances
WeakMap instances inherit properties from the WeakMap prototype. After initialisation by the WeakMap constructor, WeakMap instances also have a [[WeakMapData]] internal data property.
15.16 Set Objects
Set objects are collections of arbitrary ECMAScript language values. Each distinct value, as determined using the SameValue algorithm, may only occur once within a Set. A Set object can also iterate its elements in insertion order. Set objects must be implemented using hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structures used in this Set objects specification is only intended to describe the required observable semantics of Set objects. It is not intended to be a viable implementation model.
15.16.1 Abstract Operations For Set Objects
15.16.1.1 SetInitialisation
The abstract operation SetInitialisation with arguments obj and iterable is used to initialize an object as a set instance. It performs the following steps:
15.16.2 The Set Constructor Called as a Function
When Set is called as a function rather than as a constructor, it initializes its this value with the internal state necessary to support the Set.prototype internal methods. This permits super invocation of the Set constructor by Set subclasses.
15.16.2.1 Set (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces two element array-like objects whose first element is a value that will be used as an Map key and whose second element is the value to associate with that key.
15.16.3 The Set Constructor
When Set is called as part of a new expression it is a constructor: it initialises the newly created object.
15.16.3.1 new Set (iterable = undefined )
NOTE If the parameter iterable is present, it is expected to be an object that implements either a values method or an @@iterator method. Either method is expected to return an interator object that returns the values that will be the initial elements of the set.
15.16.4 Properties of the Set Constructor
The value of the [[Prototype]] internal data property of the Set constructor is the Function prototype object (15.3.4).
Besides the length property (whose value is 0), the Set constructor has the following property:
15.16.4.1 Set.prototype
The initial value of Set.prototype is the intrinsic %SetPrototype% object (15.16.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
15.16.5 Properties of the Set Prototype Object
The value of the [[Prototype]] internal data property of the Set prototype object is the standard built-in Object prototype object (15.2.4).
15.16.5.1 Set.prototype.constructor
The initial value of Set.prototype.constructor is the built-in Set constructor.
15.16.5.2 Set.prototype.add (value )
The following steps are taken:
15.16.5.3 Set.prototype.clear ()
The following steps are taken:
15.16.5.4 Set.prototype.delete ( value )
The following steps are taken:
15.16.5.5 Set.prototype.forEach ( callbackfn , thisArg = undefined )
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each value present in the set object, in value insertion order. callbackfn is called only for values of the Set which actually exist; it is not called for keys that have been deleted from the set.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
NOTE If callbackfn is an Arrow Function, this was lexically bound when the function was created so thisArg will have no effect.
callbackfn is called with three arguments: the first two arguments are a value contained in the Set. The same value of passed for both arguments. The Set object being traversed is passed as the third argument.
NOTE The callbackfn is called with three arguments to be consistent with the call back functions used by forEach methods for Map and Array. For Sets, each item value is considered to be both the key and the value.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
NOTE Each value is normally visited only once. However, a value will be revisited if it is deleted after it has been visited and then re-added before the to forEach call completes. Values that are deleted after the call to forEach begins and before being visited are not visited unless the value is added again before the to forEach call completes. New values added, after the call to forEach begins are visited.
When the forEach method is called with one or two arguments, the following steps are taken:
The length property of the forEach method is 1.
15.16.5.6 Set.prototype.has ( value )
The following steps are taken:
15.16.5.7 get Set.prototype.size
Set.prototype.size is an accessor property whose set accessor function is undefined. Its get accessor function performs the following steps are taken:
15.16.5.8 Set.prototype.values ( )
The following steps are taken:
15.16.5.9 Set.prototype.@@iterator ( )
The initial value of the @@iterator property is the same function object as the initial value of the values property.
15.16.5.10 Set.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "Set".
15.16.6 Properties of Set Instances
Set instances inherit properties from the Set prototype. After initialisation by the Set constructor, Set instances also have a [[SetData]] internal data property.
15.16.7 Set Iterator Object Structure
A Set Iterator is an ordinary object, with the structure defined below, that represents a specific iteration over some specific Set instance object. There is not a named constructor for Set Iterator objects. Instead, set iterator objects are created by calling certain methods of Set instance objects.
15.16.7.1 CreateSetIterator Abstract Operation
The value and @@iterator methods of Set objects return interator objects. The abstract operation CreateSetIterator with argument set is used to create and such iterator objects. It performs the following steps:
15.16.7.2 The Set Iterator Prototype
All Set Iterator Objects inherit properties from a common Set Iterator Prototype object. The [[Prototype]] internal data property of the Set Iterator Prototype is the %ObjectPrototype% intrinsic object. In addition, the Set Iterator Prototype as the following properties:
15.16.7.2.1 SetIterator.prototype.constructor
15.16.7.2.2 SetIterator.prototype.next( )
15.16.7.2.3 SetIterator.prototype.@@iterator ( )
The following steps are taken:
15.16.7.2.4 SetIterator.prototype.@@toStringTag
The initial value of the @@toStringTag property is the string value "Set Iterator".
15.16.7.3 Properties of Set Iterator Instances
Set Iterator instances inherit properties from the Set Iterator prototype (the intrinsic, %SetIteratorPrototype%.) Set Iterator instances are initially created with the internal properties specified in Table 35.
Table 35 — Internal Data Properties of Set Iterator Instances
|
Internal Data Property Name |
Description |
|
[[IteratedSet]] |
The Set object that is being iterated. |
|
[[SetNextIndex]] |
The integer index of the next Set data element to be examined by this iteration. |
15.17 The Reflect Module
This is a place holder for the material in http://wiki.ecmascript.org/doku.php?id=harmony:reflect_api
15.17.1 Exported Function Properties Reflecting the Essentional Internal Methods
15.17.1.1 Reflect.getPrototypeOf (target)
When the getPrototypeOf function is called with argument target the following steps are taken:
15.17.1.2 Reflect.setPrototypeOf (target, proto)
When the setPrototypeOf function is called with arguments target and propertyKey, the following steps are taken:
15.17.1.3 Reflect.isExtensible (target)
When the isExtensible function is called with argument target the following steps are taken:
15.17.1.4 Reflect.preventExtensions (target)
When the preventExtensions function is called with argument target, the following steps are taken:
15.17.1.5 Reflect.hasOwn (target, propertyKey)
When the hasOwn function is called with arguments target and propertyKey, the following steps are taken:
15.17.1.6 Reflect.getOwnPropertyDescriptor(target, propertyKey)
When the getOwnPropertyDescriptor function is called with arguments target and propertyKey, the following steps are taken:
15.17.1.7 Reflect.get (target, propertyKey, receiver=target)
When the get function is called with arguments target, propertyKey, and receiver the following steps are taken:
15.17.1.8 Reflect.set (target, propertyKey, V, receiver=target)
When the set function is called with arguments target, V, propertyKey, and receiver the following steps are taken:
15.17.1.9 Reflect.deleteProperty (target, propertyKey)
When the deleteProperty function is called with arguments target and propertyKey, the following steps are taken:
15.17.1.10 Reflect.defineProperty(target, propertyKey, Attributes)
When the defineProperty function is called with arguments target, propertyKey, and Attributes the following steps are taken:
15.17.1.11 Reflect.enumerate (target)
When the enumerate function is called with argument target the following steps are taken:
15.17.1.12 Reflect.keys (target)
When the keys function is called with argument target the following steps are taken:
15.17.1.13 Reflect.getOwnPropertyNames (target)
When the getOwnPropertyNames function is called with argument target the following steps are taken:
15.17.1.14 Reflect.freeze (target)
When the freeze function is called with argument target the following steps are taken:
15.17.1.15 Reflect.seal (target)
When the seal function is called with argument target the following steps are taken:
15.17.1.16 Reflect.isFrozen (target)
When the isFrozen function is called with argument target the following steps are taken:
15.17.1.17 Reflect.isSealed (target)
When the isSealed function is called with argument target the following steps are taken:
15.17.2 Exported Function Properties Derived from the Essentional Internal Methods
15.17.2.1 Reflect.has (target, propertyKey)
When the has function is called with arguments target and propertyKey, the following steps are taken:
15.17.2.1 Reflect.instanceOf (target, O)
When the instanceOf function is called with arguments target and O, the following steps are taken:
15.18 Proxy Objects
16 Errors
An implementation must report most errors at the time the relevant ECMAScript language construct is evaluated. An early error is an error that can be detected and reported prior to the evaluation of any construct in the Script containing the error. An implementation must report early errors in a Script prior to the first evaluation of that Script. Early errors in eval code are reported at the time eval is called but prior to evaluation of any construct within the eval code. All errors that are not early errors are runtime errors.
An implementation must treat any instance of the following kinds of errors as an early error:
An implementation shall not treat other kinds of errors as early errors even if the compiler can prove that a construct cannot execute without error under any circumstances. An implementation may issue an early warning in such a case, but it should not report the error until the relevant construct is actually executed.
An implementation shall report all errors as specified, except for the following:
(informative)
Grammar Summary
Lexical Grammar
SourceCharacter :: See clause 6
any Unicode code unit
InputElementDiv :: See clause 7
WhiteSpace
LineTerminator
Comment
Token
DivPunctuator
InputElementRegExp :: See clause 7
WhiteSpace
LineTerminator
Comment
Token
RegularExpressionLiteral
WhiteSpace :: See 7.2
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<BOM>
<USP>
LineTerminator :: See 7.3
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence :: See 7.3
<LF>
<CR>
[lookahead ∉ <LF> ]
<LS>
<PS>
<CR>
<LF>
Comment :: See 7.4
MultiLineComment
SingleLineComment
MultiLineComment :: See 7.4
/* MultiLineCommentCharsopt */
MultiLineCommentChars :: See 7.4
MultiLineNotAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
PostAsteriskCommentChars :: See 7.4
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar :: See 7.4
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar :: See 7.4
SourceCharacter but not one of / or *
SingleLineComment :: See 7.4
// SingleLineCommentCharsopt
SingleLineCommentChars :: See 7.4
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar :: See 7.4
SourceCharacter but not LineTerminator
Token :: See 7.5
IdentifierName
Punctuator
NumericLiteral
StringLiteral
Identifier :: See 7.6
IdentifierName but not ReservedWord
IdentifierName :: See 7.6
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart :: See 7.6
UnicodeLetter
$
_
\ UnicodeEscapeSequence
IdentifierPart :: See 7.6
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
<ZWNJ>
<ZWJ>
UnicodeLetter :: See 7.6
any character in the Unicode categories “Uppercase letter (Lu)”, “Lowercase letter (Ll)”, “Titlecase letter (Lt)”, “Modifier letter (Lm)”, “Other letter (Lo)”, or “Letter number (Nl)”.
UnicodeCombiningMark :: See 7.6
any character in the Unicode categories “Non-spacing mark (Mn)” or “Combining spacing mark (Mc)”
UnicodeDigit :: See 7.6
any character in the Unicode category “Decimal number (Nd)”
UnicodeConnectorPunctuation :: See 7.6
any character in the Unicode category “Connector punctuation (Pc)”
ReservedWord :: See 7.6.1
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
Keyword :: one of See 7.6.1.1
|
break |
do |
instanceof |
typeof |
|
case |
else |
new |
var |
|
catch |
finally |
return |
void |
|
continue |
for |
switch |
while |
|
debugger |
function |
this |
with |
|
default |
if |
throw |
|
|
delete |
in |
try |
FutureReservedWord :: one of See 7.6.1.2
|
class |
enum |
extends |
super |
|
const |
export |
import |
The following tokens are also considered to be FutureReservedWords when parsing strict mode code (see 10.1.1).
|
implements |
let |
private |
public |
|
interface |
package |
protected |
static |
|
yield |
Punctuator :: one of See 7.7
|
{ |
} |
( |
) |
[ |
] |
|
. |
; |
, |
< |
> |
<= |
|
>= |
== |
!= |
=== |
!== |
|
|
+ |
- |
* |
% |
++ |
-- |
|
<< |
>> |
>>> |
& |
| |
^ |
|
! |
~ |
&& |
|| |
? |
: |
|
= |
+= |
-= |
*= |
%= |
<<= |
|
>>= |
>>>= |
&= |
|= |
^= |
DivPunctuator :: one of See 7.7
|
/ |
/= |
Literal :: See 7.8
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
NullLiteral :: See 7.8.1
null
BooleanLiteral :: See 7.8.2
true
false
NumericLiteral :: See 7.8.3
DecimalLiteral
HexIntegerLiteral
DecimalLiteral :: See 7.8.3
DecimalIntegerLiteral . DecimalDigitsopt
ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral
ExponentPartopt
DecimalIntegerLiteral :: See 7.8.3
0
NonZeroDigit
DecimalDigitsopt
DecimalDigits :: See 7.8.3
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of See 7.8.3
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of See 7.8.3
1 2 3 4 5 6 7 8 9
ExponentPart :: See 7.8.3
ExponentIndicator SignedInteger
ExponentIndicator :: one of See 7.8.3
e E
SignedInteger :: See 7.8.3
DecimalDigits
+ DecimalDigits
-
DecimalDigits
HexIntegerLiteral :: See 7.8.3
0x
HexDigit
0X HexDigit
HexIntegerLiteral
HexDigit
HexDigit :: one of See 7.8.3
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
StringLiteral :: See 7.8.4
"
DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters :: See 7.8.4
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters :: See 7.8.4
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter :: See 7.8.4
SourceCharacter but not one
of " or \ or LineTerminator
\ EscapeSequence
LineContinuation
SingleStringCharacter :: See 7.8.4
SourceCharacter but not one
of ' or \ or LineTerminator
\ EscapeSequence
LineContinuation
LineContinuation :: See 7.8.4
\ LineTerminatorSequence
EscapeSequence :: See 7.8.4
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence :: See 7.8.4
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of See 7.8.4
' " \ b f n r t v
NonEscapeCharacter :: See 7.8.4
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter :: See 7.8.4
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence :: See 7.8.4
x HexDigit HexDigit
UnicodeEscapeSequence :: See 7.8.4
u HexDigit HexDigit HexDigit HexDigit
RegularExpressionLiteral :: See 7.8.5
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody :: See 7.8.5
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars :: See 7.8.5
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar :: See 7.8.5
RegularExpressionNonTerminator but not one of * or \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar :: See 7.8.5
RegularExpressionNonTerminator but not \ or / or
[
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence :: See 7.8.5
\ RegularExpressionNonTerminator
RegularExpressionNonTerminator :: See 7.8.5
SourceCharacter but not LineTerminator
RegularExpressionClass :: See 7.8.5
[ RegularExpressionClassChars ]
RegularExpressionClassChars :: See 7.8.5
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar :: See 7.8.5
RegularExpressionNonTerminator but not ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags :: See 7.8.5
[empty]
RegularExpressionFlags IdentifierPart
Number Conversions
StringNumericLiteral ::: See 9.1.3.1
StrWhiteSpaceopt
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace ::: See 9.1.3.1
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar ::: See 9.1.3.1
WhiteSpace
LineTerminator
StrNumericLiteral ::: See 9.1.3.1
StrDecimalLiteral
HexIntegerLiteral
StrDecimalLiteral ::: See 9.1.3.1
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral ::: See 9.1.3.1
Infinity
DecimalDigits .
DecimalDigitsopt
ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalDigits ExponentPartopt
DecimalDigits ::: See 9.1.3.1
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit ::: one of See 9.1.3.1
0 1 2 3 4 5 6 7 8 9
ExponentPart ::: See 9.1.3.1
ExponentIndicator SignedInteger
ExponentIndicator ::: one of See 9.1.3.1
e E
SignedInteger ::: See 9.1.3.1
DecimalDigits
+
DecimalDigits
- DecimalDigits
HexIntegerLiteral ::: See 9.1.3.1
0x
HexDigit
0X HexDigit
HexIntegerLiteral
HexDigit
HexDigit ::: one of See 9.1.3.1
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
Expressions
PrimaryExpression : See 11.1
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
ArrayLiteral : See 11.1.4
[ Elisionopt ]
[ ElementList ]
[ ElementList , Elisionopt ]
ElementList : See 11.1.4
Elisionopt AssignmentExpression
ElementList , Elisionopt
AssignmentExpression
Elision : See 11.1.4
,
Elision
,
ObjectLiteral : See 11.1.5
{ }
{ PropertyDefinitionList }
{ PropertyDefinitionList , }
PropertyDefinitionList : See 11.1.5
PropertyDefinition
PropertyDefinitionList , PropertyDefinition
PropertyDefinition : See 11.1.5
PropertyName :
AssignmentExpression
get PropertyName ( ) { FunctionBody }
set PropertyName (
PropertySetParameterList ) {
FunctionBody }
PropertyName : See 11.1.5
IdentifierName
StringLiteral
NumericLiteral
PropertySetParameterList : See 11.1.5
Identifier
MemberExpression : See 11.2
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
NewExpression : See 11.2
MemberExpression
new NewExpression
CallExpression : See 11.2
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression
]
CallExpression . IdentifierName
Arguments : See 11.2
( )
( ArgumentList )
ArgumentList : See 11.2
AssignmentExpression
ArgumentList , AssignmentExpression
LeftHandSideExpression : See 11.2
NewExpression
CallExpression
PostfixExpression : See 11.3
LeftHandSideExpression
LeftHandSideExpression [no LineTerminator here]
++
LeftHandSideExpression [no LineTerminator here] --
UnaryExpression : See 11.4
PostfixExpression
delete UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
++
UnaryExpression
--
UnaryExpression
+ UnaryExpression
- UnaryExpression
~ UnaryExpression
! UnaryExpression
MultiplicativeExpression : See 11.5
UnaryExpression
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
AdditiveExpression : See 11.6
MultiplicativeExpression
AdditiveExpression + MultiplicativeExpression
AdditiveExpression - MultiplicativeExpression
ShiftExpression : See 11.7
AdditiveExpression
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
RelationalExpression : See 11.8
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression
RelationalExpressionNoIn : See 11.8
ShiftExpression
RelationalExpressionNoIn < ShiftExpression
RelationalExpressionNoIn > ShiftExpression
RelationalExpressionNoIn <= ShiftExpression
RelationalExpressionNoIn >= ShiftExpression
RelationalExpressionNoIn instanceof ShiftExpression
EqualityExpression : See 11.9
RelationalExpression
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
EqualityExpressionNoIn : See 11.9
RelationalExpressionNoIn
EqualityExpressionNoIn == RelationalExpressionNoIn
EqualityExpressionNoIn != RelationalExpressionNoIn
EqualityExpressionNoIn === RelationalExpressionNoIn
EqualityExpressionNoIn !== RelationalExpressionNoIn
BitwiseANDExpression : See 11.10
EqualityExpression
BitwiseANDExpression & EqualityExpression
BitwiseANDExpressionNoIn : See 11.10
EqualityExpressionNoIn
BitwiseANDExpressionNoIn & EqualityExpressionNoIn
BitwiseXORExpression : See 11.10
BitwiseANDExpression
BitwiseXORExpression ^ BitwiseANDExpression
BitwiseXORExpressionNoIn : See 11.10
BitwiseANDExpressionNoIn
BitwiseXORExpressionNoIn ^ BitwiseANDExpressionNoIn
BitwiseORExpression : See 11.10
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
BitwiseORExpressionNoIn : See 11.10
BitwiseXORExpressionNoIn
BitwiseORExpressionNoIn | BitwiseXORExpressionNoIn
LogicalANDExpression : See 11.11
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalANDExpressionNoIn : See 11.11
BitwiseORExpressionNoIn
LogicalANDExpressionNoIn && BitwiseORExpressionNoIn
LogicalORExpression : See 11.11
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
LogicalORExpressionNoIn : See 11.11
LogicalANDExpressionNoIn
LogicalORExpressionNoIn || LogicalANDExpressionNoIn
ConditionalExpression : See 11.12
LogicalORExpression
LogicalORExpression ? AssignmentExpression : AssignmentExpression
ConditionalExpressionNoIn : See 11.12
LogicalORExpressionNoIn
LogicalORExpressionNoIn ? AssignmentExpression : AssignmentExpressionNoIn
AssignmentExpression : See 11.13
ConditionalExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentExpressionNoIn : See 11.13
ConditionalExpressionNoIn
LeftHandSideExpression = AssignmentExpressionNoIn
LeftHandSideExpression AssignmentOperator
AssignmentExpressionNoIn
AssignmentOperator : one of See 11.13
|
*= |
/= |
%= |
+= |
-= |
<<= |
>>= |
>>>= |
&= |
^= |
|= |
Expression : See 11.14
AssignmentExpression
Expression , AssignmentExpression
ExpressionNoIn : See 11.14
AssignmentExpressionNoIn
ExpressionNoIn , AssignmentExpressionNoIn
Statements
Statement : See clause 12
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
DebuggerStatement
Block : See 12.1
{ StatementListopt }
StatementList : See 12.1
Statement
StatementList Statement
VariableStatement : See 12.2
var VariableDeclarationList ;
VariableDeclarationList : See 12.2
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn : See 12.2
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration : See 12.2
Identifier Initialiseropt
VariableDeclarationNoIn : See 12.2
Identifier InitialiserNoInopt
Initialiser : See 12.2
= AssignmentExpression
InitialiserNoIn : See 12.2
= AssignmentExpressionNoIn
EmptyStatement : See 12.3
;
ExpressionStatement : See 12.4
[lookahead ∉ {{, function}] Expression ;
IfStatement : See 12.5
if ( Expression ) Statement else Statement
if ( Expression ) Statement
IterationStatement : See 12.6
do Statement while ( Expression );
while ( Expression ) Statement
for (ExpressionNoInopt; Expressionopt ; Expressionopt )
Statement
for ( var VariableDeclarationListNoIn; Expressionopt
; Expressionopt ) Statement
for
( LeftHandSideExpression in Expression ) Statement
for ( var VariableDeclarationNoIn in Expression ) Statement
ContinueStatement : See 12.7
continue ;
continue [no LineTerminator here] Identifier ;
BreakStatement : See 12.8
break ;
break [no LineTerminator here] Identifier ;
ReturnStatement : See 12.9
return ;
return [no LineTerminator here] Expression ;
WithStatement : See 12.10
with ( Expression ) Statement
SwitchStatement : See 12.11
switch ( Expression ) CaseBlock
CaseBlock : See 12.11
{
CaseClausesopt }
{ CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses : See 12.11
CaseClause
CaseClauses CaseClause
CaseClause : See 12.11
case Expression : StatementListopt
DefaultClause : See 12.11
default : StatementListopt
LabelledStatement : See 12.12
Identifier : Statement
ThrowStatement : See 12.13
throw [no LineTerminator here] Expression ;
TryStatement : See 12.14
try Block
Catch
try Block Finally
try Block Catch Finally
Catch : See 12.14
catch ( Identifier ) Block
Finally : See 12.14
finally Block
DebuggerStatement : See 12.15
debugger ;
Functions and Scripts
FunctionDeclaration : See clause 13
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression : See clause 13
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
FormalParameterList : See clause 13
Identifier
FormalParameterList , Identifier
FunctionBody : See clause 13
SourceElementsopt
Program : See clause 14
SourceElementsopt
SourceElements : See clause 14
SourceElement
SourceElements SourceElement
SourceElement : See clause 14
Statement
FunctionDeclaration
Universal Resource Identifier Character Classes
uri ::: See 15.1.3
uriCharactersopt
uriCharacters ::: See 15.1.3
uriCharacter uriCharactersopt
uriCharacter ::: See 15.1.3
uriReserved
uriUnescaped
uriEscaped
uriReserved ::: one of See 15.1.3
; / ? : @ & = + $ ,
uriUnescaped ::: See 15.1.3
uriAlpha
DecimalDigit
uriMark
uriEscaped ::: See 15.1.3
% HexDigit HexDigit
uriAlpha ::: one of See 15.1.3
a b c d e f g h
i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
uriMark ::: one of See 15.1.3
- _ . ! ~ * ' ( )
Regular Expressions
Pattern :: See 15.10.1
Disjunction
Disjunction :: See 15.10.1
Alternative
Alternative | Disjunction
Alternative :: See 15.10.1
[empty]
Alternative
Term
Term :: See 15.10.1
Assertion
Atom
Atom Quantifier
Assertion :: See 15.10.1
^
$
\ b
\ B
( ? = Disjunction )
( ? ! Disjunction )
Quantifier :: See 15.10.1
QuantifierPrefix
QuantifierPrefix ?
QuantifierPrefix :: See 15.10.1
*
+
?
{ DecimalDigits }
{ DecimalDigits , }
{ DecimalDigits , DecimalDigits }
Atom :: See 15.10.1
PatternCharacter
.
\ AtomEscape
CharacterClass
( Disjunction )
( ? : Disjunction )
PatternCharacter :: See 15.10.1
SourceCharacter but not one
of-
^ $ \ . * + ? ( ) [ ] { } |
AtomEscape :: See 15.10.1
DecimalEscape
CharacterEscape
CharacterClassEscape
CharacterEscape :: See 15.10.1
ControlEscape
c ControlLetter
HexEscapeSequence
UnicodeEscapeSequence
IdentityEscape
ControlEscape :: one of See 15.10.1
f n r t v
ControlLetter :: one of See 15.10.1
a b c d e f g h
i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
IdentityEscape :: See 15.10.1
SourceCharacter but not
IdentifierPart
<ZWJ>
<ZWNJ>
DecimalEscape :: See 15.10.1
DecimalIntegerLiteral [lookahead ∉ DecimalDigit]
CharacterClassEscape :: one of See 15.10.1
d D s S w W
CharacterClass :: See 15.10.1
[ [lookahead ∉ {^}] ClassRanges ]
[ ^ ClassRanges ]
ClassRanges :: See 15.10.1
[empty]
NonemptyClassRanges
NonemptyClassRanges :: See 15.10.1
ClassAtom
ClassAtom NonemptyClassRangesNoDash
ClassAtom – ClassAtom ClassRanges
NonemptyClassRangesNoDash :: See 15.10.1
ClassAtom
ClassAtomNoDash NonemptyClassRangesNoDash
ClassAtomNoDash – ClassAtom ClassRanges
ClassAtom :: See 15.10.1
-
ClassAtomNoDash
ClassAtomNoDash :: See 15.10.1
SourceCharacter but
not one of \ or ] or -
\ ClassEscape
ClassEscape :: See 15.10.1
DecimalEscape
b
CharacterEscape
CharacterClassEscape
JSON
JSON Lexical Grammar
JSONWhiteSpace :: See 15.12.1.1
<TAB>
<CR>
<LF>
<SP>
JSONString :: See 15.12.1.1
" JSONStringCharactersopt "
JSONStringCharacters :: See 15.12.1.1
JSONStringCharacter JSONStringCharactersopt
JSONStringCharacter :: See 15.12.1.1
SourceCharacter but not one of " or \ or U+0000 through U+001F
\ JSONEscapeSequence
JSONEscapeSequence :: See 15.12.1.1
JSONEscapeCharacter
UnicodeEscapeSequence
JSONEscapeCharacter :: one of See 15.12.1.1
" / \ b f n r t
JSONNumber :: See 15.12.1.1
-opt DecimalIntegerLiteral JSONFractionopt ExponentPartopt
JSONFraction :: See 15.12.1.1
. DecimalDigits
JSONNullLiteral :: See 15.12.1.1
NullLiteral
JSONBooleanLiteral :: See 15.12.1.1
BooleanLiteral
JSON Syntactic Grammar
JSONText : See 15.12.1.2
JSONValue
JSONValue : See 15.12.1.2
JSONNullLiteral
JSONBooleanLiteral
JSONObject
JSONArray
JSONString
JSONNumber
JSONObject : See 15.12.1.2
{
}
{ JSONMemberList }
JSONMember : See 15.12.1.2
JSONString : JSONValue
JSONMemberList : See 15.12.1.2
JSONMember
JSONMemberList , JSONMember
JSONArray : See 15.12.1.2
[
]
[ JSONElementList ]
JSONElementList : See 15.12.1.2
JSONValue
JSONElementList
, JSONValue
(normative)
Additional ECMAScript Features for Web
Browsers
The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript host is a web browser. The content of this annex is normative but optional if the ECMAScript host is not a web browser.
Additional Syntax
Numeric Literals
The syntax and semantics of 7.8.3 is extended as follows except that this extension is not allowed for strict mode code:
Syntax
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
LegacyOctalIntegerLiteral
LegacyOctalIntegerLiteral ::
0
OctalDigit
LegacyOctalIntegerLiteral OctalDigit
Static
Semantics
String Literals
The syntax and semantics of 7.8.4 is extended as follows except that this extension is not allowed for strict mode code:
Syntax
EscapeSequence ::
CharacterEscapeSequence
OctalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
OctalEscapeSequence ::
OctalDigit [lookahead
∉ DecimalDigit]
ZeroToThree
OctalDigit [lookahead ∉ DecimalDigit]
FourToSeven OctalDigit
ZeroToThree OctalDigit
OctalDigit
ZeroToThree :: one of
0 1 2 3
FourToSeven :: one of
4 5 6 7
Static Semantics
Additional Properties
When the ECMAScript host is a web browser the following additional properties of the standard built-in objects are defined.
Additional Properties of the Global Object
escape (string)
The escape function is a property of the global object. It computes a new version of a String value in which certain characters have been replaced by a hexadecimal escape sequence.
For those characters being replaced whose code unit value is 0xFF or less, a two-digit escape sequence of the form %xx is used. For those characters being replaced whose code unit value is greater than 0xFF, a four-digit escape sequence of the form %uxxxx is used.
When the escape function is called with one argument string, the following steps are taken:
NOTE The encoding is partly based on the encoding described in RFC 1738, but the entire encoding specified in this standard is described above without regard to the contents of RFC 1738. This encoding does not reflect changes to RFC 1738 made by RFC 3986.
unescape (string)
The unescape function is a property of the global object. It computes a new version of a String value in which each escape sequence of the sort that might be introduced by the escape function is replaced with the character that it represents.
When the unescape function is called with one argument string, the following steps are taken:
Additional Properties of the String.prototype Object
String.prototype.substr (start, length)
The substr method takes two arguments, start and length, and returns a substring of the result of converting the this object to a String, starting from character position start and running for length characters (or through the end of the String if length is undefined). If start is negative, it is treated as (sourceLength+start) where sourceLength is the length of the String. The result is a String value, not a String object. The following steps are taken:
The length property of the substr method is 2.
NOTE The substr function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
String.prototype.anchor ( name )
When the anchor method is called with argument name, the following steps are taken:
The abstract operation CreateHTML is called with arguments string, tag, attribute, and value. The arguments tag and attribute must be string values. The following steps are taken:
String.prototype.big ()
When the big method is called with no arguments, the following steps are taken:
String.prototype.blink ()
When the blink method is called with no arguments, the following steps are taken:
String.prototype.bold ()
When the bold method is called with no arguments, the following steps are taken:
String.prototype.fixed ()
When the fixed method is called with no arguments, the following steps are taken:
String.prototype.fontcolor ( color )
When the fontcolor method is called with argument color, the following steps are taken:
String.prototype.fontsize ( size )
When the fontsize method is called with argument size, the following steps are taken:
String.prototype.italics ()
When the italics method is called with no arguments, the following steps are taken:
String.prototype.link ( url )
When the link method is called with argument url, the following steps are taken:
String.prototype.small ()
When the small method is called with no arguments, the following steps are taken:
String.prototype.strike ()
When the strike method is called with no arguments, the following steps are taken:
String.prototype.sub ()
When the sub method is called with no arguments, the following steps are taken:
String.prototype.sup ()
When the sup method is called with no arguments, the following steps are taken:
Additional Properties of the Date.prototype Object
Date.prototype.getYear ( )
NOTE The getFullYear method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
When the getYear method is called with no arguments, the following steps are taken:
Date.prototype.setYear (year)
NOTE The setFullYear method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
When the setYear method is called with one argument year, the following steps are taken:
Date.prototype.toGMTString ( )
NOTE The property toUTCString is preferred. The toGMTString property is provided principally for compatibility with old code. It is recommended that the toUTCString property be used in new ECMAScript code.
The Function object that is the initial value of Date.prototype.toGMTString is the same Function object that is the initial value of Date.prototype.toUTCString.
Other Additional Features
The __proto__ pseudo property.
Object.prototype.__proto__
The initial value of the __proto__ property of the Object prototype object is a data property whose initial value is null. This property initially has the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }.
Manipulations of this property as tracked by the Boolean valued primordial internal variable UnderscoreProtoEnabled. The default initial value of UnderscoreProtoEnabled is true only if this property is initially present on the primordial Object prototype object.
NOTE Any modification of this property or its attributes causes UnderscoreProtoEnabled to be set to false.
Changes To Internal Methods__
The definition of the [[GetP]] internal method given in 8.12.3 is replaced with the following:
The definition of the [[Put]] internal method given in 8.12.5 is replaced with the following:
The definition of the [[Delete]] internal method given in 8.12.7 is replaced with the following:
The definition of the [[DefineOwnProperty]] internal method given in 8.12.9 is replaced with the following:
__proto___ Object Initialisers _
Definitions of two algorithms in 11.1.5 are replaced with the following:
The production PropertyDefinitionList : PropertyDefinition is evaluated as follows:
The production
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
is evaluated as follows:
(informative)
The Strict Mode of ECMAScript
The strict mode restriction and exceptions
(informative)
Corrections and Clarifications
with Possible Compatibility Impact
In Edition 6
15.9.1.15: If a time zone offset is not present, the local time zone is used. Edition 5.1 incorrectly stated that a missing time zone should be interpreted as “z”.
15.9.5.2: Previous editions did not specify the value returned by Date.prototype.toString when this time value is NaN. The 6th Edition species the result to be the String value is "Invalid Date"
In 5.1 Edition 5.1
7.8.4: CV definitions added for DoubleStringCharacter :: LineContinuation and SingleStringCharacter :: LineContinuation.
10.2.1.1.3: The argument S is not ignored. It controls whether an exception is thrown when attempting to set an immutable binding.
10.2.1.2.2: In algorithm step 5, true is passed as the last argument to [[DefineOwnProperty]].
10.5: Former algorithm step 5.e is now 5.f and a new step 5.e was added to restore compatibility with 3rd Edition when redefining global functions.
11.5.3: In the final bullet item, use of IEEE 754 round-to-nearest mode is specified.
12.6.3: Missing ToBoolean restored in step 3.a.ii of both algorithms.
12.6.4: Additional final sentences in each of the last two paragraphs clarify certain property enumeration requirements.
12.7, 12.8, 12.9: BNF modified to clarify that a continue or break statement without an Identifier or a return statement without an Expression may have a LineTerminator before the semi-colon.
12.14: Step 3 of algorithm 1 and step 2.a of algorithm 3 are corrected such that the value field of B is passed as a parameter rather than B itself.
15.1.2.2: In step 2 of algorithm, clarify that S may be the empty string.
15.1.2.3: In step 2 of algorithm clarify that trimmedString may be the empty string.
15.1.3: Added notes clarifying that ECMAScript’s URI syntax is based upon RFC 2396 and not the newer RFC 3986. In the algorithm for Decode, a step was removed that immediately preceded the current step 4.d.vii.10.a because it tested for a condition that cannot occur.
15.2.3.7: Corrected use of variable P in steps 5 and 6 of algorithm.
15.2.4.2: Edition 5 handling of undefined and null as this value caused existing code to fail. Specification modified to maintain compatibility with such code. New steps 1 and 2 added to the algorithm.
15.3.4.3: Steps 5 and 7 of Edition 5 algorithm have been deleted because they imposed requirements upon the argArray argument that are inconsistent with other uses of generic array-like objects.
15.4.4.12: In step 9.a, incorrect reference to relativeStart was replaced with a reference to actualStart.
15.4.4.15: Clarified that the default value for fromIndex is the length minus 1 of the array.
15.4.4.18: In step 9 of the algorithm, undefined is now the specified return value.
15.4.4.22: In step 9.c.ii the first argument to the [[Call]] internal method has been changed to undefined for consistency with the definition of Array.prototype.reduce.
15.4.5.1: In Algorithm steps 3.l.ii and 3.l.iii the variable name was inverted resulting in an incorrectly inverted test.
15.5.4.9: Normative requirement concerning canonically equivalent strings deleted from paragraph following algorithm because it is listed as a recommendation in NOTE 2.
15.5.4.14: In split algorithm step 11.a and 13.a, the positional order of the arguments to SplitMatch was corrected to match the actual parameter signature of SplitMatch. In step 13.a.iii.7.d, lengthA replaces A.length.
15.5.5.2: In first paragraph, removed the implication that the individual character property access had “array index” semantics. Modified algorithm steps 3 and 5 such that they do not enforce “array index” requirement.
15.9.1.15: Specified legal value ranges for fields that lacked them. Eliminated “time-only” formats. Specified default values for all optional fields.
15.10.2.2: The step numbers of the algorithm for the internal closure produced by step 2 were incorrectly numbered in a manner that implied that they were steps of the outer algorithm.
15.10.2.6: In the abstract operation IsWordChar the first character in the list in step 3 is “a” rather than “A”.
15.10.2.8: In the algorithm for the closure returned by the abstract operation CharacterSetMatcher, the variable defined by step 3 and passed as an argument in step 4 was renamed to ch in order to avoid a name conflict with a formal parameter of the closure.
15.10.6.2: Step 9.e was deleted because It performed an extra increment of i.
15.11.1.1: Removed requirement that the message own property is set to the empty String when the message argument is undefined.
15.11.1.2: Removed requirement that the message own property is set to the empty String when the message argument is undefined.
15.11.4.4: Steps 6-10 modified/added to correctly deal with missing or empty message property value.
15.11.1.2: Removed requirement that the message own property is set to the empty String when the message argument is undefined.
15.12.3: In step 10.b.iii of the JA internal operation, the last element of the concatenation is “]”.
B.2.1: Added to NOTE that the encoding is based upon RFC 1738 rather than the newer RFC 3986.
Annex C: An item was added corresponding to 7.6.12 regarding FutureReservedWords in strict mode.
In 5th Edition 5
Throughout: In the Edition 3 specification the meaning of phrases such as “as if by the expression new Array()” are subject to misinterpretation. In the Edition 5 specification text for all internal references and invocations of standard built-in objects and methods has been clarified by making it explicit that the intent is that the actual built-in object is to be used rather than the current dynamic value of the correspondingly named property.
11.8.1: ECMAScript generally uses a left to right evaluation order, however the Edition 3 specification language for the > and <= operators resulted in a partial right to left order. The specification has been corrected for these operators such that it now specifies a full left to right evaluation order. However, this change of order is potentially observable if side-effects occur during the evaluation process.
11.1.4: Edition 5 clarifies the fact that a trailing comma at the end of an ArrayInitialiser does not add to the length of the array. This is not a semantic change from Edition 3 but some implementations may have previously misinterpreted this.
11.2.3: Edition 5 reverses the order of steps 2 and 3 of the algorithm. The original order as specified in Editions 1 through 3 was incorrectly specified such that side-effects of evaluating Arguments could affect the result of evaluating MemberExpression.
12.4: In Edition 3, an object is created, as if by new Object()to serve as the scope for resolving the name of the exception parameter passed to a catch clause of a try statement. If the actual exception object is a function and it is called from within the catch clause, the scope object will be passed as the this value of the call. The body of the function can then define new properties on its this value and those property names become visible identifiers bindings within the scope of the catch clause after the function returns. In Edition 5, when an exception parameter is called as a function, undefined is passed as the this value.
13: In Edition 3, the algorithm for the production FunctionExpression with an Identifier adds an object created as if by new Object() to the scope chain to serve as a scope for looking up the name of the function. The identifier resolution rules (10.1.4 in Edition 3) when applied to such an object will, if necessary, follow the object’s prototype chain when attempting to resolve an identifier. This means all the properties of Object.prototype are visible as identifiers within that scope. In practice most implementations of Edition 3 have not implemented this semantics. Edition 5 changes the specified semantics by using a Declarative Environment Record to bind the name of the function.
14: In Edition 3, the algorithm for the production SourceElements : SourceElements SourceElement did not correctly propagate statement result values in the same manner as Block. This could result in the eval function producing an incorrect result when evaluating a Program text. In practice most implementations of Edition 3 have implemented the correct propagation rather than what was specified in Edition 5.
15.10.6: RegExp.prototype is now a RegExp object rather than an instance of Object. The value of its [[Class]] internal data property which is observable using Object.prototype.toString is now “RegExp” rather than “Object”.
(informative)
Additions and Changes that
Introduce Incompatibilities with Prior Editions
In the 6th Edition
12.6: In Edition 6, a terminating semi-colon is no longer required at the end of a do-while statement.
12.14: In Edition 6, it is an early error for a Catch clause to contained a var declaration for the same Identifier that appears as the Catch clause parameter. In previous editions, such a variable declaration would be instantiated in the enclosing variable environment but the declaration’s Initializer value would be assigned to the Catch parameter.
13.3 In Edition 6, the function objects that are created as the values of the [[Get]] or [[Set]] attribute of accessor properties in an ObjectLiteral are not constructor functions. In Edition 5, they were constructors.
15.2.3.5 and 15.2.3.7: In Edition 6, all property additions and changes are processed, even if one of them throws an acception. If an exception occurs during such processing, the first such exception is thrown after all propertie are processed. In Edition 5, processing of property additions and changes immediately terminated when the first exception occurred.
In the 5th Edition
7.1: Unicode format control characters are no longer stripped from ECMAScript source text before processing. In Edition 5, if such a character appears in a StringLiteral or RegularExpressionLiteral the character will be incorporated into the literal where in Edition 3 the character would not be incorporated into the literal.
7.2: Unicode character <BOM> is now treated as whitespace and its presence in the middle of what appears to be an identifier could result in a syntax error which would not have occurred in Edition 3
7.3: Line terminator characters that are preceded by an escape sequence are now allowed within a string literal token. In Edition 3 a syntax error would have been produced.
7.8.5: Regular expression literals now return a unique object each time the literal is evaluated. This change is detectable by any programs that test the object identity of such literal values or that are sensitive to the shared side effects.
7.8.5: Edition 5 requires early reporting of any possible RegExp constructor errors that would be produced when converting a RegularExpressionLiteral to a RegExp object. Prior to Edition 5 implementations were permitted to defer the reporting of such errors until the actual execution time creation of the object.
7.8.5: In Edition 5 unescaped “/” characters may appear as a CharacterClass in a regular expression literal. In Edition 3 such a character would have been interpreted as the final character of the literal.
10.4.2: In Edition 5, indirect calls to the eval function use the global environment as both the variable environment and lexical environment for the eval code. In Edition 3, the variable and lexical environments of the caller of an indirect eval was used as the environments for the eval code.
15.4.4: In Edition 5 all methods of Array.prototype are intentionally generic. In Edition 3 toString and toLocaleString were not generic and would throw a TypeError exception if applied to objects that were not instances of Array.
10.6: In Edition 5 the array indexed properties of argument objects that correspond to actual formal parameters are enumerable. In Edition 3, such properties were not enumerable.
10.6: In Edition 5 the value of the [[Class]] internal data property of an arguments object is "Arguments". In Edition 3, it was "Object". This is observable if toString is called as a method of an arguments object.
12.6.4: for-in statements no longer throw a TypeError if the in expression evaluates to null or undefined. Instead, the statement behaves as if the value of the expression was an object with no enumerable properties.
15: In Edition 5, the following new properties are defined on built-in objects that exist in Edition 3: Object.getPrototypeOf, Object.getOwnPropertyDescriptor, Object.getOwnPropertyNames, Object.create, Object.defineProperty, Object.defineProperties, Object.seal, Object.freeze, Object.preventExtensions, Object.isSealed, Object.isFrozen, Object.isExtensible, Object.keys, Function.prototype.bind, Array.prototype.indexOf, Array.prototype.lastIndexOf, Array.prototype.every, Array.prototype.some, Array.prototype.forEach, Array.prototype.map, Array.prototype.filter, Array.prototype.reduce, Array.prototype.reduceRight, String.prototype.trim, Date.now, Date.prototype.toISOString, Date.prototype.toJSON.
15: Implementations are now required to ignore extra arguments to standard built-in methods unless otherwise explicitly specified. In Edition 3 the handling of extra arguments was unspecified and implementations were explicitly allowed to throw a TypeError exception.
15.1.1: The value properties NaN, Infinity, and undefined of the Global Object have been changed to be read-only properties.
15.1.2.1. Implementations are no longer permitted to restrict the use of eval in ways that are not a direct call. In addition, any invocation of eval that is not a direct call uses the global environment as its variable environment rather than the caller’s variable environment.
15.1.2.2: The specification of the function parseInt no longer allows implementations to treat Strings beginning with a 0 character as octal values.
15.3.4.3: In Edition 3, a TypeError is thrown if the second argument passed to Function.prototype.apply is neither an array object nor an arguments object. In Edition 5, the second argument may be any kind of generic array-like object that has a valid length property.
15.3.4.3, 15.3.4.4: In Edition 3 passing undefined or null as the first argument to either Function.prototype.apply or Function.prototype.call causes the global object to be passed to the indirectly invoked target function as the this value. If the first argument is a primitive value the result of calling ToObject on the primitive value is passed as the this value. In Edition 5, these transformations are not performed and the actual first argument value is passed as the this value. This difference will normally be unobservable to existing ECMAScript Edition 3 code because a corresponding transformation takes place upon activation of the target function. However, depending upon the implementation, this difference may be observable by host object functions called using apply or call. In addition, invoking a standard built-in function in this manner with null or undefined passed as the this value will in many cases cause behaviour in Edition 5 implementations that differ from Edition 3 behaviour. In particular, in Edition 5 built-in functions that are specified to actually use the passed this value as an object typically throw a TypeError exception if passed null or undefined as the this value.
15.3.5.2: In Edition 5, the prototype property of Function instances is not enumerable. In Edition 3, this property was enumerable.
15.5.5.2: In Edition 5, the individual characters of a String object’s [[StringData] may be accessed as array indexed properties of the String object. These properties are non-writable and non-configurable and shadow any inherited properties with the same names. In Edition 3, these properties did not exist and ECMAScript code could dynamically add and remove writable properties with such names and could access inherited properties with such names.
15.9.4.2: Date.parse is now required to first attempt to parse its argument as an ISO format string. Programs that use this format but depended upon implementation specific behaviour (including failure) may behave differently.
15.10.2.12: In Edition 5, \s now additionally matches <BOM>.
15.10.4.1: In Edition 3, the exact form of the String value of the source property of an object created by the RegExp constructor is implementation defined. In Edition 5, the String must conform to certain specified requirements and hence may be different from that produced by an Edition 3 implementation.
15.10.6.4: In Edition 3, the result of RegExp.prototype.toString need not be derived from the value of the RegExp object’s source property. In Edition 5 the result must be derived from the source property in a specified manner and hence may be different from the result produced by an Edition 3 implementation.
15.11.2.1, 15.11.4.3: In Edition 5, if an initial value for the message property of an Error object is not specified via the Error constructor the initial value of the property is the empty String. In Edition 3, such an initial value is implementation defined.
15.11.4.4: In Edition 3, the result of Error.prototype.toString is implementation defined. In Edition 5, the result is fully specified and hence may differ from some Edition 3 implementations.
15.12: In Edition 5, the name JSON is defined in the global environment. In Edition 3, testing for the presence of that name will show it to be undefined unless it is defined by the program or implementation.
(informative)
Static Semantic Rule Cross Reference
|
Routine Name |
Purpose |
Definitions |
Uses |
|
BoundNames |
Produces a list of the Identifiers bound by a production. Does not include Identifiers that are bound within inner environments associated with the production. |
12.2.1, 12.2.2, 12.2.4, 12.6.4, 13.1, 13.2, 13.5 |
|
|
ConstructorMethod |
From a ClassBody return the first ClassElement whose PropName is ″constructor″. Returns empty if the ClassBody does not contain one. |
13.5 |
|
|
Contains |
Determine if a grammar production either directly or indirectly includes a grammar symbol. |
5.3, 13.1, 13.2, 13.5 |
|
|
CoveredFormalsList |
Reparse a covered Expression using FormalsList as the goal symbol. |
13.2 |
|
|
CV |
Determines the “character value” of a component of a StringLiteral. |
7.8.4 |
|
|
Elision Width |
Determine the number of commas in an Elision. |
11.1.4.1 |
|
|
ExpectedArgumentCount |
Determine the “length” of an argument list for the purpose of initializing the “length” property of a function object. |
13.1, 13.2, 13.3 |
|
|
HasInitialiser |
Determines whether the production contains an Initialiser production. |
12.2.4, 13.1 |
|
|
IsConstantDeclaration |
Determines whether the production introduces a immutable environment record binding |
12.2, 13.1, 13.5 |
|
|
IsInvalidAssignmentPattern |
Determines if a LeftHandSideExpression is a valid assignment target. Primarily for dealing with destructuring assignment targets. |
11.2 |
|
|
LexicalDeclarations |
Return a List containing the components of a production that are processed as lexical declarations |
12.1, 12.11, 12.5 |
|
|
LexicallyDeclaredNames |
Returns a list of the lexically scoped identifiers declared by a production. |
12.1, 13.1, 13.2, 13.5 |
|
|
MethodDefinitions |
Return a list of the MethodDefinition productions that are part of a ClassElementList. |
13.5 |
|
|
MV |
Determines the “mathematical value” of a numeric lirteral or component of a numeric literal. |
7.8.3 |
|
|
PropName |
Determines the string value of the property name referenced by a production. |
11.1.5.1, 13.3, 13.5 |
|
|
PropNameList |
Returns a List of the string values of the property names referenced by a production. The list reflects the order of the references in the source text. The list may contain duplicate elements. |
11.5.1, 13.5 |
|
|
ReferencesSuper |
Determine if a MethodDefinition contains any references to the ReservedWord super. |
13.3 |
|
|
SpecialMethod |
Determine if a MethodDefinition defines a generator method or an accessor property. |
13.3 |
|
|
SV |
Determines the “string value” of a StringLiteral or component of a StringLiteral. |
7.8.4 |
|
|
VarDeclaredNames |
Returns a list of the local top-level scoped identifiers declared by a production. These are identifier that are scoped as if by a var statement. |
12.1, 12.5, 12.6.1, 12.6.2, 12.6.3, 12.6.4, 12.12, 13.1, 13.5 |
A place to temporarily hand on to stuff that’s been deleted
MemberExpression :
MemberExpression <|
TriangleLiteral
TriangleLiteral :
SealedArrayLiteral
SealedObjectLiteral
FunctionExpression
ArrowFunction
ValueLiteral
CallExpression :
CallExpression <| TriangleLiteral
15.2.3.15 Object.isObject ( O )
When the isObject function is called with argument O, the following steps are taken:
15.5.4.25 String.prototype.toArray()
The following steps are taken:
The length property of the toArray method is 0.
NOTE 1 Returns an Array object with elements corresponding to the characters of this object (converted to a String).
NOTE 2 The toArray function is intentionally generic; it does not require that its this value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
Static Semantics: TopLevelLexicallyDeclaredNames
OuterStatementList : OuterStatementList OuterItem
OuterItem : StatementListItem
StatementListItem : Declaration
8.3.10 [[Enumerate]] (includePrototype, onlyEnumerable )
When the [[Enumerate]] internal method of O is called with Boolean arguments includePrototype and onlyEnumerable, the following steps are taken:
Enumerated properties do not include properties whose property key is a private name. Properties of the object being enumerated may be deleted during enumeration. If a property that has not yet been visited during enumeration is deleted, then it will not be visited. If new properties are added to the object being enumerated during enumeration, the newly added properties are not guaranteed to be visited in the active enumeration. A property name must not be visited more than once in any enumeration.
Enumerating the properties of an object includes enumerating properties of its prototype, and the prototype of the prototype, and so on, recursively; but a property of a prototype is not enumerated if it is “shadowed” because some previous object in the prototype chain has a property with the same name. The values of [[Enumerable]] attributes are not considered when determining if a property of a prototype object is shadowed by a previous object on the prototype chain.
The following is an informative algorithm that conforms to these rules
This follow version places function body declarations in scope of parameter initializers
10.5.3 Function Declaration Instantiation
NOTE When an execution context is established for evaluating function code a new Declarative Environment Record is created and bindings for each formal parameter, and each function level variable, constant, or function declarated in the function are instantiated in the environment record. Formal parameters and functions are initialized as part of this process. All other bindings are initialized during execution of the function code.
Function Declaration Instantiation is performed as follows using arguments func, argumentsList, and env. func is the function object that for which the execution context is being established. env is the declarative environment record in which bindings are to be created.
Table 1 — Internal Properties Only Defined for Some Objects
|
Internal Property |
Value Type Domain |
Description |
|
[[BuiltinBrand]] |
The BuiltinBrand enumeration. |
A tag value used by this specification to categorize various kinds of ECMAScript objects defined in this specification. |
|
[[PrimitiveValue]] |
primitive |
Internal state information associated with this object. Of the standard built-in ECMAScript objects, only Boolean, Date, Number, and String objects implement [[PrimitiveValue]]. |
|
[[Scope]] |
Lexical Environment |
A lexical environment that is the environment in which a Function object is executed. Of the standard built-in ECMAScript objects, only Function objects implement [[Scope]]. |
|
[[FormalParameters]] |
Parse Tree |
A parse tree for ECMAScript code parsed with FormalParameterList as the goal symbol. Of the standard built-in ECMAScript objects, only Function objects implement [[FormalParameters]]. |
|
[[Code]] |
Parse Tree |
A parse tree for ECMAScript code parsed with FunctionBody as the goal symbol. Of the standard built-in ECMAScript objects, only Function objects implement [[Code]]. |
|
[[Strict]] |
Boolean |
true if a Function object is a strict mode function. Of the standard built-in ECMAScript objects, only Function objects implement [[Strict]]. |
|
[[BoundTargetFunction]] |
Object |
The target function of a function object created using the standard built-in Function.prototype.bind method. Only ECMAScript objects created using Function.prototype.bind have a [[BoundTargetFunction]] internal property. |
|
[[BoundThis]] |
any |
The pre-bound this value of a function Object created using the standard built-in Function.prototype.bind method. Only ECMAScript objects created using Function.prototype.bind have a [[BoundThis]] internal property. |
|
[[BoundArguments]] |
List of any |
The pre-bound argument values of a function Object created by the standard built-in Function.prototype.bind method. Only objects created by Function.prototype.bind have a [[BoundArguments]] internal property. |
|
[[Match]] |
SpecOp(String, index) → MatchResult |
Tests for a regular expression match and returns a MatchResult value (see 15.10.2.1). Of the standard built-in ECMAScript objects, only RegExp objects implement [[Match]]. |
|
[[ParameterMap]] |
Object |
Provides a mapping between the properties of an arguments object (see 10.6) and the formal parameters of the associated function. Only objects that are arguments objects have a [[ParameterMap]] internal property. |
IEEE Std 754-2008: IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronic Engineers, New York (2008)
The Unicode Consortium. The Unicode Standard, Version 3.0, defined by: The Unicode Standard, Version 3.0 (Reading, MA, Addison-Wesley, 2000. ISBN 0-201-61633-5)
Unicode Inc. (2010), Unicode Technical Report #15: Unicode Normalization Forms
ISO 8601:2004(E) Data elements and interchange formats – Information interchange -- Representation of dates and times
RFC 1738 "Uniform Resource Locators (URL)", available at <http://tools.ietf.org/html/rfc1738>
RFC 2396 "Uniform Resource Identifiers (URI): Generic Syntax", available at <http://tools.ietf.org/html/rfc2396>
RFC 3629 "UTF-8, a transformation format of ISO 10646", available at <http://tools.ietf.org/html/rfc3629>
RFC 4627 "The application/json Media Type for JavaScript Object Notation (JSON)" , available at <http://tools.ietf.org/html/rfc4627>